2010-04-07 6 views
2

J'ai WPF Form qui a beaucoup de boutons avec le même code. Apparence de tous les boutons doivent être identiques Par exemple, le code pour un de ces boutonsWPF Boutons Style

<Button x:Name="btnAddRelative" Width="120" Click="btnAddRelative_Click" > 
    <Button.Content> 
     <StackPanel Orientation="Horizontal"> 
      <Image Height="26" HorizontalAlignment="Left"> 
        <Image.Source> 
         <BitmapImage UriSource="images/add.png" /> 
        </Image.Source> 
      </Image> 
      <TextBlock Text=" Add Relative" Height="20" VerticalAlignment="Center"/> 
     </StackPanel> 
    </Button.Content> 
</Button> 

Comment puis-je créer un style et l'utiliser pour tous mes boutons. Tous les boutons ont la même image png, seul leur texte est différent. Comment puis-je faire ceci. J'ai essayé de le faire avec un objet Style dans la section des ressources:

<UserControl.Resources> 
    <Style TargetType="Button" x:Key="AddStyle"> 
     <Setter Property="Content"> 
      <Setter.Value> 
       <StackPanel Orientation="Horizontal"> 
        <Image Height="26" HorizontalAlignment="Left"> 
         <Image.Source> 
          <BitmapImage UriSource="images/add.png" /> 
         </Image.Source> 
        </Image> 
        <TextBlock Text=" " Height="20" VerticalAlignment="Center"/> 
       </StackPanel> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

Mais ce code fonctionne pas. Quelqu'un peut-il savoir comment puis-je faire cela?

Répondre

7

Si l'image est fixe, vous pouvez coder en dur dans le style, et utiliser le contenu propriété de bouton bin à la Contenu de Tex Tbox

<Style x:Key="ButtonStyle" TargetType="Button"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border 
          Background="{TemplateBinding Background}"        
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
          <StackPanel 
           Orientation="Horizontal"> 
           <!--<Image Height="26" HorizontalAlignment="Left"> 
            <Image.Source> 
             <BitmapImage UriSource="images/add.png" /> 
            </Image.Source> 
           </Image>--> 
           <TextBlock 
            Foreground="{TemplateBinding Foreground}" 
            Text="{TemplateBinding Content}" 
            Height="20" 
            VerticalAlignment="{TemplateBinding VerticalAlignment}"/> 
          </StackPanel> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
+0

Merci beaucoup. Super personnel. Ca marche comme je veux !!!! – Polaris

0

Essayez de changer votre style comme suit

<UserControl.Resources> 
     <Style 
      TargetType="Button" 
      x:Key="AddStyle"> 
      <Setter 
       Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <StackPanel 
          Orientation="Horizontal"> 
          <Image 
           Height="26" 
           HorizontalAlignment="Left"> 
           <Image.Source> 
            <BitmapImage 
             UriSource="images/add.png" /> 
           </Image.Source> 
          </Image> 
          <TextBlock 
           Text=" " 
           Height="20" 
           VerticalAlignment="Center" /> 
         </StackPanel> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

[Editer inspirée par commentaire]

Vous pouvez créer une nouvelle UserControl, permet de l'appeler AddButtonContent contenant votre StackPanel et tels, puis d'inclure cela à l'intérieur de votre bouton, comme ceci:

<Button> 
    <local:AddButtonContent 
     ButtonText="Testing, one, two, three" /> 
</Button> 

Vous devrez ajouter une référence xmlns appelée locale (ou ce que vous voulez appeler) à UserControl avec tous les boutons.

La partie codebehind de votre UserControl AddButtonContent aura besoin du code suivant, et vous devrez nommer votre TextBlock (j'ai utilisé testText pour cet exemple).

DependencyProperty public static ButtonTextProperty = DependencyProperty.Register ("ButtonText", typeof (string), typeof (AddButtonContent), nouveau PropertyMetadata ("", onTextChangedCallback));

public string ButtonText 
{ 
    get { return (string)GetValue(ButtonTextProperty); } 
    set 
    { 
     SetValue(ButtonTextProperty, value); 
    } 
} 


static void onTextChangedCallback(
    DependencyObject dobj, 
    DependencyPropertyChangedEventArgs args) 
{ 
    AddButtonContent abc = dobj as AddButtonContent; 
    abc.testText.Text = args.NewValue.ToString(); 
} 
+0

Il fonctionne. Mais pas comme je veux. J'ai le style de niveau d'application dans ResourceDictionary. Ton style remplace mon style. La chose principale que je veux montrer mon PNG et le texte spécifique, mais pas nettoyer mon style de bouton principal – Polaris

+0

Polaris, en utilisant un UserControl et en réglant le contenu du bouton à ce nouveau contrôle peut travailler pour vous. Mise à jour ma réponse –

+0

Dans un stackPanel j'ai TextBlock. TextBlock Le texte doit être spécifique à chaque bouton. Avec la version userControl, je ne peux pas modifier le texte TextBlock. – Polaris

2

juste essayer cette

<Window.Resources> 
    <Style TargetType="Button" 
      x:Key="AddStyle"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <StackPanel Orientation="Horizontal"> 
         <Image Height="26" 
           Width="20" 
           HorizontalAlignment="Left"> 
          <Image.Source> 
           <BitmapImage UriSource="/WpfApplication33;component/Images/MoveLeft.png" /> 
          </Image.Source> 
         </Image> 
         <TextBlock Text ="{TemplateBinding Content}" 
            Height="20" 
            /> 
        </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

</Window.Resources> 
<Grid> 
    <StackPanel> 
    <Button Style="{StaticResource AddStyle}" 
      Height="25" Width="100" 
      Content="Button1"></Button> 
    <Button Style="{StaticResource AddStyle}" 
      Height="25" 
      Width="100" 

      Content="Button22"></Button> 
     <Button Style="{StaticResource AddStyle}" 
       Height="25" 
       Width="100" 
       Content="Button2233"></Button> 
     <Button Style="{StaticResource AddStyle}" 
       Height="25" 
       Width="100" 
       Content="Button2332"></Button> 

    </StackPanel> 
</Grid> 

Remarque: Utilisez ContentPresenter au lieu de TextBlock si vous devez afficher autre chose que du texte plat

+0

lol, même code, mais vous avez pris moins de temps pour l'écrire: D – Drake