我正在尝试为按钮创建一个模板,以防止控件在禁用时变灰,它工作正常,但由于某种原因,一旦我为它设置颜色它就不会改变背景按钮属性。
这是我制作的按钮:
<Style TargetType="Button" x:Key="TestButton"> <Setter Property="SnapsToDevicePixels" Value="true" /> <Setter Property="OverridesDefaultStyle" Value="true" /> <Setter Property="MinHeight" Value="29px" /> <Setter Property="MinWidth" Value="103px" /> <Setter Property="Foreground" Value="Black" /> <Setter Property="Background" Value="#EEEEEE"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border TextBlock.Foreground="{TemplateBinding Foreground}" x:Name="Border"> <Border.Background> <SolidColorBrush Color="{TemplateBinding Background}" /> </Border.Background> <Border.BorderBrush> <SolidColorBrush Color="Black" /> </Border.BorderBrush> <Border.BorderThickness> <Thickness Top="0.75" Bottom="0.75" Right="0.75" Left="0.75"/> </Border.BorderThickness> <Border.CornerRadius> <CornerRadius TopLeft="3" TopRight="3" BottomLeft="3" BottomRight="3"/> </Border.CornerRadius> <ContentPresenter Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True" /> </Border> <!--Triggers--> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="#E1F3FD" /> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Background" Value="#C4E9FF" /> <Setter Property="Effect"> <Setter.Value> <DropShadowEffect Color="Black" Direction="500" ShadowDepth="1" BlurRadius="5" Opacity="0.5" /> </Setter.Value> </Setter> </Trigger> <Trigger Property="IsEnabled" Value="false"> <Setter TargetName="Border" Property="Background" Value="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=Background}"/> <Setter Property="Opacity" Value="0.5" /> </Trigger> <Trigger Property="IsEnabled" Value="True" > <Setter TargetName="Border" Property="Background" Value="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=Background}" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
当我打电话给它时,给我两个不同的结果,有效的是:
<Button Style="{DynamicResource ResourceKey=TestButton}" Content="Button" Height="66" Name="button1" Width="149" Click="button1_Click" />
但是当我为它添加背景时,由于某种原因它会停止更改背景:
<Button Style="{DynamicResource ResourceKey=TestButton}" Background="Orange" Content="Button" Height="66" Name="button1" Width="149" Click="button1_Click" />
答案 0 :(得分:3)
它不会改变颜色,因为您使用在MainWindow.xaml中定义的颜色“覆盖”颜色。
它的被称为依赖属性值优先。
要了解更多信息,请查看以下内容:
http://msdn.microsoft.com/en-us/library/ms743230.aspx
在您的情况下,您在样式和触发器中定义了背景,然后在MainWindow中设置了值。 MainWindow中设置的值被视为本地值,而样式中设置的值是“样式 - 值”。
如果你看看我给你的链接,你会发现本地值在“样式 - 值”之前出现。
本地价值非常强大。
这就是为什么即使禁用按钮也会始终为橙色的原因。触发器触发时,属性系统将尝试查找背景值,并始终找到本地值,因为这是具有最高优先级的值。
为了使其正常工作,在设置Button的背景值时,必须使用SetCurrentValue而不是SetValue。 (意味着你必须覆盖按钮代码)
看看这个:
http://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.setcurrentvalue.aspx
此方法由组件使用,该组件以编程方式设置其自身属性之一的值,而不禁用应用程序声明的属性使用。 SetCurrentValue方法更改属性的有效值,但现有的触发器,数据绑定和样式将继续有效。
修改强>
了解依赖项属性值优先级和命中测试的示例。
<Window.Resources>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Yellow" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<TextBlock Height="20" Margin="40" Text="asdfasdfa" VerticalAlignment="Bottom"/>
<Rectangle Height="100" VerticalAlignment="Bottom" >
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Offset="0"/>
<GradientStop Color="White" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Grid>
答案 1 :(得分:3)
如果查看DependecyProperty value precedence order,您会看到在控件上显式设置值(视为本地值)将覆盖触发器设置的任何值。
答案 2 :(得分:2)
请注意:Background
属性的类型为Brush
,因此您应该写
<Border Background="{TemplateBinding Background}" ...>
...
</Border>
而不是
<Border ...>
<Border.Background>
<SolidColorBrush Color="{TemplateBinding Background}" />
</Border.Background>
...
</Border>