2009-08-05 8 views
1

Je suis très nouveau à WPF, alors s'il vous plaît garder avec moi.WPF définir l'image pour un bouton dans le code C# derrière à l'exécution

Fondamentalement, j'ai défini un style dans un pour afficher les boutons WPF UserControl avec une image comme suit:

<UserControl.Resources> 
    <Style TargetType="Button"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"> 
         <Image Width="16" Height="16" Stretch="UniformToFill"/> 
         <ContentPresenter/> 
        </TextBlock> 
       </ControlTemplate> 
      </Setter.Value> 

     </Setter> 
    </Style> 
</UserControl.Resources> 

-je ajouter ensuite une charge de boutons à une grille à l'exécution (il doit être au moment de l'exécution comme le nombre et le type de bouton est dynamique).

Ce que je voudrais faire est également de définir l'image des boutons lors de l'exécution. J'ai essayé plusieurs façons, mais aucune ne semble fonctionner. Définir la source dans le Xaml fonctionne très bien. Le code que je suis en train est la suivante:

Button b = new Button(); 
// Create source. 
BitmapImage bi = new BitmapImage(); 
bi.BeginInit(); 
bi.UriSource = new Uri(@"C:\SourceCode\DSA\DSALibrary\Icons\money.png"); 
bi.EndInit(); 

b.SetValue(Image.SourceProperty, bi); 

Quelqu'un pourrait me diriger vers l'endroit où je vais mal, si je devais deviner, je dirais que là où je pense que je suis la mise en valeur, je Je ne suis pas vraiment.

Vive

+0

Quel type est B'? Votre bouton dérivé UserControl? –

+0

Le problème est que Button n'est pas une image .. Et vous essayez de définir une propriété étrange (pour le bouton) sur b .. Vous pouvez définir le bitmap sur le contenu du bouton et utiliser un datatemplate (voir réponse) – Arcturus

+0

Modifié pour afficher ce que B. @ Arcturus, je pensais que ce pourrait être le problème, je n'étais pas sûr de savoir comment je vais le faire, si les modèles de données sont la voie à suivre, merci beaucoup. – MrEdmundo

Répondre

3

Vous pouvez essayer d'utiliser la propriété Contenu du bouton, et déclarer un DataTemplate pour traiter le contenu:

<UserControl.Resources> 
    <Style TargetType="Button"> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <Image Width="16" Height="16" Stretch="UniformToFill" Source="{Binding}"/> 
         <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="My button text" /> 
        </StackPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <ContentPresenter/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</UserControl.Resources> 

Réglez le BitmapImage sur le contenu de votre bouton, et le tour est joué :)

+0

OK ... Je suis avec toi. Je dois admettre que je n'ai pas encore atteint la liaison. Pourriez-vous m'indiquer comment je définis ce qu'est "{Binding}"? Merci – MrEdmundo

+0

Juste un petit point, je ne peux pas voir comment le texte du bouton est défini dans votre exemple ci-dessus? – MrEdmundo

+0

Lorsque vous définissez le bouton Content on, ContentControl (Button) utilise un ContentPresenter interne. ContentPresenter définira le contenu en tant que DataSource. La propriété DataSource est la propriété qui détermera la liaison directe. Ainsi, la {Binding} crée une liaison à la DataSource, qui se trouve être le contenu qui est l'image Bitmap ... :) – Arcturus

0

Pouvez-vous confirmer que c'est un objet dérivé System.Windows.Controls.UserControl que vous créez? Je suppose que le contrôle charge son bitmap lorsque vous le créez afin de définir la propriété de la source d'image après que celle-ci n'a pas été interceptée. Avez-vous essayé de créer un bouton par programmation avec une création en deux étapes et en le définissant avant de faire la deuxième étape?

Vous pouvez essayer d'appeler la fonction Invalidate() du bouton pour vous assurer qu'il est redessiné.

Questions connexes