WPF STYLE: Не можете изменить фон кнопки? - PullRequest
3 голосов
/ 20 июля 2011

Я пытаюсь изменить background одной кнопки при нажатии другой кнопки.

Я не могу этого сделать, если я предоставляю стиль кнопке.

См. Мой код ниже.

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="Button" x:Key="TransparentButton">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border  CornerRadius="2,2,2,2"  HorizontalAlignment="Center" x:Name="borderTemplate" Background="Transparent">
                            <ContentPresenter/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter TargetName="borderTemplate"  Property="Border.BorderBrush" Value="Gray" />
                                <Setter TargetName="borderTemplate"  Property="Border.BorderThickness" Value="1" />
                            </Trigger>
                            <Trigger Property="IsPressed" Value="true">
                                <Setter TargetName="borderTemplate"  Property="Border.BorderBrush" Value="Lime" />
                            </Trigger>
                            <Trigger Property="IsFocused" Value="true">
                                <Setter TargetName="borderTemplate"  Property="Border.Background" Value="#FD7" />
                            </Trigger>

                            <Trigger Property="IsEnabled" Value="false">
                                <Setter TargetName="borderTemplate"  Property="Border.Background" Value="LightGray"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Button Content="Button" Style="{StaticResource TransparentButton}" Height="23" HorizontalAlignment="Left" Margin="20,25,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="143,177,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="button2_Click" />
    </Grid>
</Window>

MainWindow.xaml.cs

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            //This doesn't work if i providing style to button  ==> Style="{StaticResource TransparentButton}"
            button1.Background = Brushes.Red;
        }
    }

Спасибо .....

Ответы [ 3 ]

16 голосов
/ 20 июля 2011

Я уже ответил на это в ваш другой вопрос

Ваш стиль переписывает ControlTemplate кнопки, поэтому цвет фона больше не используется

Шаблон кнопки по умолчанию выглядит следующим образом:

<Button Background="SomeColor">
    <Button.Content>
</Button>

И вы перезаписываете шаблон, чтобы сказать

<Border>
    <Button.Content>
</Border>

Измените свой ControlTemplate на

<Border Background="{TemplateBinding Background}">
    <Button.Content>
</Border>

и будет работать

1 голос
/ 20 июля 2011

На этой строке:

<Border  CornerRadius="2,2,2,2"  HorizontalAlignment="Center" x:Name="borderTemplate" Background="Transparent">

Вы фиксируете фон кнопки прозрачным. Он больше не связан со свойством Background элемента управления Button, поэтому изменение этого свойства больше не распространяется на стиль.

Если вы используете привязку «TemplatedParent», это позволит вам снова установить связь между элементом управления и его стилем - например, так:

<Border  CornerRadius="2,2,2,2"  HorizontalAlignment="Center" x:Name="borderTemplate" Background="{Binding  RelativeSoure={RelativeSource TemplatedParent}, Path=Background}">

И тогда вы можете установить фон кнопки:

<Button Name="button1" Background="Transparent" ..... />
1 голос
/ 20 июля 2011

Похоже, стиль, определенный в шаблоне (Background="Transparent"), всегда переопределяет значение, предоставленное вами из кода.Попробуйте удалить его из XAML и определить в конструкторе в качестве фона кнопки по умолчанию.Просто чтобы проверить.В общем, я бы не советовал делать это в коде позади, вместо этого переместить такую ​​логику в XAML.

...