【问题标题】:Why does my style not get picked up?为什么我的风格不被接受?
【发布时间】:2017-11-16 17:30:14
【问题描述】:

我正在尝试通过在ResourceDictionary 中定义的Style 将样式应用于所有FrameworkElement 对象。在一个特定的视图中,我包含了资源字典,并且上面有一个 TextBox,我想使用该样式。

所以,这是我玩过的两个定义:

    <!-- STYLE USED BY ALL FRAMEWORK ELEMENTS TO DISPLAY TOOLTIP ON VALIDATION ERROR -->
    <Style TargetType="{x:Type FrameworkElement}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError"
                     Value="True">
                <Setter Property="ToolTip"
                        Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
            </Trigger>
        </Style.Triggers>
    </Style>

    <!-- STYLE USED BY ALL TEXTBOX CONTROLS FOR VALIDATION ERROR DISPLAY -->
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <DockPanel LastChildFill="True">
                        <Image DockPanel.Dock="Right"
                               Source="{StaticResource imgDisallow16}" Width="16"/>
                        <Border BorderBrush="Red"
                                BorderThickness="1">
                            <AdornedElementPlaceholder />
                        </Border>
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

正如所写,Tooltip 的样式不会生效。如果我给该样式一个x:Key 并直接在TextBox 上引用该名称,它就可以工作。但是为什么FrameworkElement 类型不这样做呢?因为TextBox继承自它,也就是说。

同样,如果我将 Tooltip 触发器添加到第二种样式中,则可以。那个没有名字,但目标是TextBox。那么为什么没有名字就可以工作,而第一个却不行呢?

编辑:这是`TextBox

<TextBox Grid.Row="0"
     Grid.Column="2">
    <TextBox.Text>
    <Binding Path="CurrentEquipment.Name"
         Mode="TwoWay"
         ValidatesOnNotifyDataErrors="True"
         NotifyOnValidationError="True"
         UpdateSourceTrigger="PropertyChanged">
        <Binding.ValidationRules>
            <vr:EmailValidationRule />
        </Binding.ValidationRules>
    </Binding>
    </TextBox.Text>
</TextBox>

【问题讨论】:

  • 它只是不能这样工作。您的FrameworkElement 样式不会应用于子类(文本框、按钮或任何其他)。样式完全按类型匹配。

标签: c# wpf xaml


【解决方案1】:

TextBox 样式不会扩展 FrameworkElement 样式,除非您明确地将前者基于后者:

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type FrameworkElement}}">
    ...
</Style>

【讨论】:

  • 不确定我是否关注。这似乎反过来了。我想要任何基于FrameworkElement 的东西来获取工具提示,不管它是什么。不只是文本框
  • TextBox 元素仅采用隐式 TextBox 样式,而不采用 TextBox 样式 FrameworkElement 样式,除非您将前者基于后者,正如我在回答中解释的那样。因此,您需要将任何隐式控件样式基于隐式 FrameworkElement 样式。
  • 我要质疑的部分是,它似乎仍然特定于TextBox。所以如果我想为ComboBox 做同样的事情,我必须为此定义另一种样式,即使它们都继承自FrameworkElement 并且样式定义将是多余的。
  • 好吧,不幸的是,这是有限的。继承作为一个有用的工具就这么多。谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2021-04-22
  • 1970-01-01
相关资源
最近更新 更多