2015-04-08 2 views
1

Я динамически создаю кнопку во время выполнения и добавляю изображение на кнопку в качестве контента (star.png). Код ниже отлично работает, но вот сделка. Я хочу, чтобы векторное изображение было обработано пикселизованным изображением. Я могу сделать это внутри XAML, но я не знаю, как воспроизвести это через C# внутри моего .cs-файла динамически. Вот мой код для рабочих пиксельных звездных изображений.Как включить векторные ресурсы изображений в WPF C#

Внутри моего MainWindow.xaml.cs

while (sqlite_datareader.Read()) 
{ 
    System.Windows.Controls.Button starBtn = new System.Windows.Controls.Button(); 
    Uri resourceUri = new Uri("Images/star.png", UriKind.Relative); //HERE I WANT TO ADD THE CANVAS OF THE XAML AS IMAGE 
    StreamResourceInfo streamInfo = System.Windows.Application.GetResourceStream(resourceUri); 
    BitmapFrame temp = BitmapFrame.Create(streamInfo.Stream); 
    var brush = new ImageBrush(); 
    brush.ImageSource = temp; 
    starBtn.Width = 24; 
    starBtn.Height = 24; 
    starBtn.Style = (Style)FindResource("StarButtonStyle"); 
    starBtn.Background = brush; 
    splMain.Children.Add(starBtn); 
} 

Внутри моей App.xaml

<ControlTemplate x:Key="StarBlue"> 
     <Viewbox Stretch="Uniform"> 
      <Canvas Name="Layer_1" Width="300" Height="300" ClipToBounds="True" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
       <Canvas> 
        <Path Fill="#FF44B39B"> 
         <Path.Data> 
          <PathGeometry FillRule="Nonzero" Figures="M150.52,15.398C75.958,15.398 15.519,75.84 15.519,150.399 15.519,224.954 75.958,285.402 150.52,285.402 225.077,285.402 285.521,224.954 285.521,150.399 285.521,75.84 225.076,15.398 150.52,15.398z M150.52,266.312C86.502,266.312 34.607,214.415 34.607,150.399 34.607,86.383 86.502,34.49 150.52,34.49 214.533,34.49 266.43,86.384 266.43,150.399 266.43,214.414 214.532,266.312 150.52,266.312z" /> 
         </Path.Data> 
        </Path> 
        <Path Fill="#FF44B39B"> 
         <Path.Data> 
          <PathGeometry FillRule="Nonzero" Figures="M254.947,150.401C254.947,208.073 208.191,254.825 150.519,254.825 92.842,254.825 46.089,208.073 46.089,150.401 46.089,92.725 92.842,45.969 150.519,45.969 208.191,45.969 254.947,92.725 254.947,150.401z" /> 
         </Path.Data> 
        </Path> 
        <Path Fill="#FFFFFFFF"> 
         <Path.Data> 
          <PathGeometry FillRule="Nonzero" Figures="M196.328,220.879L150.523,196.796 104.72,220.871 113.465,169.872 76.405,133.759 127.623,126.317 150.52,79.918 173.424,126.317 224.631,133.759 187.573,169.872z" /> 
         </Path.Data> 
        </Path> 
       </Canvas> 
      </Canvas> 
     </Viewbox> 
    </ControlTemplate> 

Внутри моей MainWindow.xaml

<Button x:Name="unBtn" Style="{StaticResource MinButtonStyle}" Height="30" Margin="448,256,10,0" VerticalAlignment="Top" Click="unBtn_Click" FontSize="10" BorderBrush="{x:Null}"> 
     <StackPanel Orientation="Horizontal"> 
       <ContentControl Template="{StaticResource StarBlue}" /> 
     </StackPanel> 
    </Button> 

Так точный вопрос, как может Я использую графику холста {StarBlue} на моей кнопке динамически как содержимое внутри файла .cs, например, в цикле while()?

+1

Вы могли бы сделать Viewbox ресурс, вместо ControlTemplate, а затем получить его FindResource и назначить его к свойству Content Button. Но это не так, как вы должны это делать. Вместо этого создайте класс модели представления для кнопок и используйте элемент ItemsControl для отображения их коллекции. Начните читать здесь: [Обзор шаблонов данных] (https://msdn.microsoft.com/en-us/library/ms742521.aspx). – Clemens

+0

Спасибо за подсказку Клеменса. В качестве ответа я опубликовал первый подход. В настоящий момент я спешу, но обязательно рассмотрю второй подход, который вы упомянули позже. – Purstein

ответ

0

Я придумал решение благодаря намеку Клеменса. Я использовал Viewbox вместо ControlTemplate.

Внутри моих MainWindow.xaml.cs

while(sqlite_datareader.Read()) 
{ 
    System.Windows.Controls.Button starBtn = new System.Windows.Controls.Button(); 
    Viewbox dynamicViewbox = (Viewbox)System.Windows.Application.Current.FindResource("StarBlue"); 
    dynamicViewbox.StretchDirection = StretchDirection.Both; 
    dynamicViewbox.Stretch = Stretch.Fill; 
    starBtn.Style = (Style)FindResource("StarButtonStyle"); 
    starBtn.Padding = new Thickness(0,0,0,0); 
    starBtn.Margin = new Thickness(0,0,0,0); 
    starBtn.Width = 24; 
    starBtn.Height = 24; 
    starBtn.Content = dynamicViewbox; 
    splMain.Children.Add(starBtn); 
} 

Внутри моего App.xaml

<Viewbox x:Key="StarBlue"> 
    <Canvas Name="Layer_1" Width="300" Height="300" ClipToBounds="True" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
     <Canvas> 
      <Path Fill="#FF44B39B"> 
       <Path.Data> 
        <PathGeometry FillRule="Nonzero" Figures="M150.52,15.398C75.958,15.398 15.519,75.84 15.519,150.399 15.519,224.954 75.958,285.402 150.52,285.402 225.077,285.402 285.521,224.954 285.521,150.399 285.521,75.84 225.076,15.398 150.52,15.398z M150.52,266.312C86.502,266.312 34.607,214.415 34.607,150.399 34.607,86.383 86.502,34.49 150.52,34.49 214.533,34.49 266.43,86.384 266.43,150.399 266.43,214.414 214.532,266.312 150.52,266.312z" /> 
       </Path.Data> 
      </Path> 
      <Path Fill="#FF44B39B"> 
       <Path.Data> 
        <PathGeometry FillRule="Nonzero" Figures="M254.947,150.401C254.947,208.073 208.191,254.825 150.519,254.825 92.842,254.825 46.089,208.073 46.089,150.401 46.089,92.725 92.842,45.969 150.519,45.969 208.191,45.969 254.947,92.725 254.947,150.401z" /> 
       </Path.Data> 
      </Path> 
      <Path Fill="#FFFFFFFF"> 
       <Path.Data> 
        <PathGeometry FillRule="Nonzero" Figures="M196.328,220.879L150.523,196.796 104.72,220.871 113.465,169.872 76.405,133.759 127.623,126.317 150.52,79.918 173.424,126.317 224.631,133.759 187.573,169.872z" /> 
       </Path.Data> 
      </Path> 
     </Canvas> 
    </Canvas> 
</Viewbox>