WPF STYLE:无法更改按钮的背景?

时间:2011-07-20 13:07:34

标签: c# wpf xaml button styles

单击另一个按钮时,我尝试更改一个按钮的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 个答案:

答案 0 :(得分:16)

我已经在your other question

中回答了这个问题

您的样式会重写Button的ControlTemplate,因此不再使用背景颜色

默认按钮模板如下所示:

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

你正在覆盖模板说

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

将ControlTemplate更改为

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

它会起作用

答案 1 :(得分:1)

看起来在模板(Background="Transparent")中定义的样式始终会覆盖您从代码后面提供的值。尝试将其从XAML中删除,并在构造函数中将其定义为按钮的默认背景。只是为了检查。 一般来说,我不建议在后面的代码中执行此操作,而是在XAML中移动此类逻辑。

答案 2 :(得分:1)

在这一行:

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

您将按钮的背景固定为透明。它不再链接到按钮控件的Background属性,因此更改该属性不再向下传播到样式。

如果使用“TemplatedParent”绑定,它将允许您重新连接控件和它的样式之间的链接 - 如下所示:

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

然后你可以设置按钮的背景:

<Button Name="button1" Background="Transparent" ..... />