【问题标题】:TargetType does not match type of elementTargetType 与元素类型不匹配
【发布时间】:2015-06-12 13:48:44
【问题描述】:

我为Button 中的TargetType 定义了一个简单的buttonStyle;但是将样式设置为按钮会产生异常。

<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 与 元素“控制”。


此外,将TargetType 设置为Control 会消除运行时错误,但按钮的视觉样式在获得Focus 时不会改变。


样式设置为Button.Style时有效


编辑 我有两个具体问题:

  1. 我同意FocusVisualStyleFrameworkElementFrameworkContentElement 的属性这一事实,但是为什么在按钮上设置它会出错,尽管Style 是一个namedstyle 而不是 typedstyle ?

  2. 为什么FocusVisualStyle 不会在Button 上呈现? Button.FocusVisualStyle 是否在内部被任何更高优先级的值(如模板、触发器或模板触发器)覆盖?

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    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>
    

    然后,您可以设置ButtonStyle,如下所示:

    <Button Style="{StaticResource buttonStyle}" ... />
    

    【讨论】:

    • 我同意,但是当 Button 获得焦点时,它的样式不会改变。还是我理解错了?
    • 澄清一下,FocusVisualStyle 不能影响Button 的样式。它只会增加Button 的现有样式。您遇到的问题是您试图将Button 样式设置为仅接受Control 样式的FocusVisualStyle。我希望我解释得足够好。
    • 它暂时不适合我,因为我正在为按钮控件设置相同的样式属性。内联属性值覆盖了样式触发器“buttonStyle”设置的内容。甜蜜的答案!
    【解决方案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

    焦点视觉样式功能提供了一个通用的“对象模型” 将基于键盘导航的视觉用户反馈引入任何 用户界面元素。无需将新模板应用于 控制,或者知道具体的模板组成。

    【讨论】:

    • 那么FrameworkElement.FocusVisualStyle是什么意思
    【解决方案3】:

    为了说明按钮和焦点视觉样式之间的区别,请考虑以下几点:

    <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 样式可以用于任何支持它的元素。这样,无论其底层控件类型如何,都可以为任何元素使用一致的焦点样式。

    【讨论】:

      猜你喜欢
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2021-12-31
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多