首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TargetType不匹配元素的类型

TargetType不匹配元素的类型
EN

Stack Overflow用户
提问于 2015-06-12 13:48:44
回答 3查看 16.1K关注 0票数 9

我为TargetType of Button定义了一个简单的Button;但是将样式设置为按钮会让人感到意外。

代码语言:javascript
复制
<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”的类型。

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

样式在设置为Button.Style时工作

编辑I有两个具体问题:

  1. 我同意FocusVisualStyleFrameworkElementFrameworkContentElement的属性,但是为什么在按钮上设置它是错误的,尽管样式是名称样式,而不是类型样式?
  2. 为什么FocusVisualStyle不被呈现在Button上?Button.FocusVisualStyle是否在内部被更高优先级的值覆盖,如模板、触发器或模板触发器?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-12 13:54:25

FocusVisualStyle允许您在控件聚焦时向用户提供视觉反馈。例如,添加一个Rectangle,它看起来像控件的边框。

Style是控件本身的外观和感觉。这一切都解释了这里

FocusVisualStyle不是Button本身的样式,而是Button聚焦时的样式。

有关详细信息,请参阅这里

我认为你想要的是一个Trigger

代码语言:javascript
复制
<Style x:Key="buttonStyle" TargetType="{x:Type Button}">
    <Style.Triggers>
        <Trigger Property="IsFocused" Value="True">
            <Setter Property="Background" Value="Magenta"/>
        </Trigger>
    </Style.Triggers>
</Style>

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

代码语言:javascript
复制
<Button Style="{StaticResource buttonStyle}" ... />
票数 7
EN

Stack Overflow用户

发布于 2015-06-12 13:52:58

你应该这样用它

代码语言:javascript
复制
        <Style x:Key="buttonStyle" TargetType="{x:Type Button}">
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="Background" Value="Magenta" />
                </Trigger>
            </Style.Triggers>
        </Style>

然后像这样设置:

代码语言:javascript
复制
<Button Content="1" Style="{StaticResource buttonStyle}"/>

为了更好地看到这一点:

代码语言:javascript
复制
         <Style x:Key="buttonStyle" TargetType="{x:Type Button}">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Magenta" />
                </Trigger>
            </Style.Triggers>
        </Style>

来自MSDN

焦点视觉样式特性提供了一个常见的“对象模型”,用于将基于键盘导航的可视用户反馈引入到任何UI元素中。这在不向控件应用新模板或不知道特定模板组合的情况下是可能的。

票数 2
EN

Stack Overflow用户

发布于 2018-11-15 00:53:24

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

代码语言:javascript
复制
<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>

以及:

代码语言:javascript
复制
<Button
  Content="I am a green button with red focus rectangle"
  FocusVisualStyle="{StaticResource focusVisual}"
  Style="{StaticResource button}" />
<ComboBox FocusVisualStyle="{StaticResource focusVisual}" />

当按钮被赋予焦点时,这种差异将是显而易见的。该按钮应显示绿色,如果聚焦将显示一个红色焦点矩形。如果组合框获得焦点,它将有一个类似的红色矩形。

虽然按钮样式只能用于button元素,但是focusVisual样式可以用于任何支持它的元素。这样,任何元素都可以使用一致的焦点样式,而不管其底层控件类型如何。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30804752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档