TargetType与元素类型不匹配

时间:2015-06-12 13:48:45

标签: wpf xaml

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

时,样式有效

修改 我有两个具体问题:

  1. 我同意Button.Style属于FocusVisualStyleFrameworkElement的属性,但为什么在按钮上设置错误,尽管Style是 namedstyle 而不是 typedstyle

  2. 为什么FrameworkContentElement无法在FocusVisualStyle上呈现? Button内部是否被任何更高优先级的值覆盖,如模板,触发器或模板触发器?

3 个答案:

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

From MSDN

  

焦点视觉样式功能提供了一个通用的“对象模型”   基于键盘导航向任何人引入视觉用户反馈   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样式可以用于支持它的任何元素。这样,无论元素的底层控件类型如何,都可以将一致的焦点样式用于任何元素。