我为TargetType
的{{1}}定义了一个简单的buttonStyle;但是将样式设置为按钮会给出一个例外。
Button
其他信息:'按钮' TargetType与类型不匹配 元素'控制'。
此外,将<Window>
<Window.Resources>
<Style x:Key="buttonStyle" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Magenta"/>
</Style>
</Window.Resources>
<StackPanel Orientation="Horizontal">
<Button Content="1" FocusVisualStyle="{StaticResource buttonStyle}"/>
</StackPanel>
</Window>
设置为TargetType
会删除运行时错误,但按钮的视觉样式在获得Control
时不会发生变化。
设置为Focus
修改 我有两个具体问题:
我同意Button.Style
属于FocusVisualStyle
和FrameworkElement
的属性,但为什么在按钮上设置错误,尽管Style是 namedstyle 而不是 typedstyle ?
为什么FrameworkContentElement
无法在FocusVisualStyle
上呈现? Button
内部是否被任何更高优先级的值覆盖,如模板,触发器或模板触发器?
答案 0 :(得分:6)
FocusVisualStyle
可让您在关注控件时向用户提供视觉反馈。例如,添加一个看起来像控件边框的Rectangle
。
Style
是控件本身的外观。这些都解释了here。
FocusVisualStyle
不是Button
本身的风格,它是Button
聚焦时的风格。
有关详细信息,请参阅here。
我认为你所追求的是Trigger
。
<Style x:Key="buttonStyle" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Background" Value="Magenta"/>
</Trigger>
</Style.Triggers>
</Style>
然后,您可以设置Style
的{{1}},如下所示:
Button
答案 1 :(得分:2)
你应该像这样使用它
<Style x:Key="buttonStyle" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Background" Value="Magenta" />
</Trigger>
</Style.Triggers>
</Style>
并将其设置为:
<Button Content="1" Style="{StaticResource buttonStyle}"/>
更好地看待这个:
<Style x:Key="buttonStyle" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Magenta" />
</Trigger>
</Style.Triggers>
</Style>
焦点视觉样式功能提供了一个通用的“对象模型” 基于键盘导航向任何人引入视觉用户反馈 UI元素。这可以在不应用新模板的情况下实现 控制或了解特定的模板组成。
答案 2 :(得分:1)
要说明按钮和焦点视觉样式之间的区别,请考虑以下问题:
<Style x:Key="rectFocusVisual" TargetType="{x:Type Rectangle}">
<Setter Property="Margin" Value="2" />
<Setter Property="SnapsToDevicePixels" Value="true" />
<Setter Property="Stroke" Value="Red" />
<Setter Property="StrokeThickness" Value="1" />
<Setter Property="StrokeDashArray" Value="1 3" />
</Style>
<Style x:Key="focusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Style="{StaticResource rectFocusVisual}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="button" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Green" />
</Style>
和:
<Button
Content="I am a green button with red focus rectangle"
FocusVisualStyle="{StaticResource focusVisual}"
Style="{StaticResource button}" />
<ComboBox FocusVisualStyle="{StaticResource focusVisual}" />
当按钮获得焦点时,差异将显而易见。该按钮应显示为绿色,如果已聚焦,则将显示红色的聚焦矩形。如果组合框获得焦点,它将具有类似的红色矩形。
虽然按钮样式只能用于Button元素,但是focusVisual样式可以用于支持它的任何元素。这样,无论元素的底层控件类型如何,都可以将一致的焦点样式用于任何元素。