Стиль кнопок WPF - PullRequest
       8

Стиль кнопок WPF

2 голосов
/ 07 апреля 2010

У меня есть форма WPF, в которой много кнопок с одинаковым кодом. Внешний вид всех кнопок должен быть одинаковым Например, код для одной из этих кнопок

<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>

Как я могу создать один стиль и использовать его для всех моих кнопок. Все кнопки имеют одинаковое изображение PNG, только их текст отличается. Как я могу это сделать. Я пытался сделать это с объектом стиля в разделе ресурсов:

<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>

Но этот код не работает. Может ли тело знать, как я могу это сделать?

Ответы [ 3 ]

7 голосов
/ 07 апреля 2010

Если изображение исправлено, вы можете жестко закодировать его в стиле и использовать свойство Content Button bin для Content of TextBox

 <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>
2 голосов
/ 07 апреля 2010

просто попробуйте это

   <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>

Примечание: используйте ContentPresenter вместо TextBlock, если вам нужно отобразить что-либо, кроме плоского текста

0 голосов
/ 07 апреля 2010

Попробуйте изменить свой стиль следующим образом

<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>

[Редактировать вдохновленный комментарием]

Вы можете создать новый UserControl, назовем его AddButtonContent, содержащим вашу Stackpanel и т. Д., А затем включить его в вашу кнопку, например:

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

Вам нужно добавить ссылку на xmlns, называемую local (или как вы хотите ее называть), в UserControl со всеми кнопками.

Часть кода вашего AddButtonContent UserControl будет нуждаться в следующем коде, и вам нужно будет назвать ваш TextBlock (в этом примере я использовал testText).

публичная статическая DependencyProperty ButtonTextProperty = DependencyProperty.Register ( "ButtonText", TypeOf (строка), TypeOf (AddButtonContent), новые 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...