【问题标题】:Why doesn't my Textbox react on IsMouseOver in the Style for the ControlTemplate为什么我的文本框对 ControlTemplate 的样式中的 IsMouseOver 没有反应
【发布时间】:2018-11-05 14:04:23
【问题描述】:

所以我尝试对我的 TextBox 进行一些样式设置,我的想法是我想在将鼠标悬停在 TextBox 上时设置 BorderBrush 的样式,但由于某种原因它没有更改边框,所以我也尝试更改背景,并且同样的事情。那时我意识到它对 IsMouseOver 没有反应,但它确实设置了背景和我所做的一切,只是事件 IsMouseOver 没有反应。

控制

<TextBox Width="700"
         Height="340"
         HorizontalAlignment="Right"
         Margin="0,0,230,140"
         Foreground="#8bf502"
         TextWrapping="Wrap"
         Style="{DynamicResource TextboxStyle}"/>

风格

<Style TargetType="{x:Type TextBox}" x:Key="TextboxStyle">
    <Setter Property="OverridesDefaultStyle" Value="True"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Border Background="#424242">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="BorderBrush" Value="Orange"></Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【问题讨论】:

    标签: c# .net wpf mvvm resourcedictionary


    【解决方案1】:

    您缺少TargetNameBorderThickness

    <Style TargetType="{x:Type TextBox}" x:Key="TextboxStyle">
        <Setter Property="OverridesDefaultStyle" Value="True"></Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TextBox">
                    <Border Name="border" BorderThickness="2" Background="#424242">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="border" Property="BorderBrush" Value="Orange"></Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    没有Border,除非您将它的BorderThickness 属性设置为0 以外的其他值。

    【讨论】:

    • 哦,哇!否则它怎么会知道要更改什么属性!
    • 当然,添加属性BorderThickness 以实际能够看到边框,因为它默认为0。
    • 我不能在文本框中写字,为什么会这样?
    • 这确实是另一个问题。但是您的模板缺少 ScrollViewer 元素。
    • 哦,好吧,我会调查一下,如果我无法弄清楚,我会回来的。
    【解决方案2】:

    要更改边框的背景,请为边框命名并将 TargetName="MyBorder" 添加到 Setter

    【讨论】:

      【解决方案3】:

      您正在使用自定义Template,但您的模板未应用模板化TextBox 的边框属性。尝试将以下内容添加到模板中的 Border 元素:

      BorderBrush="{TemplateBinding BorderBrush}"
      BorderThickness="{TemplateBinding BorderThickness}"
      

      实际上有几种方法可以解决这个问题:使用模板绑定并将触发器放在Style;使用模板绑定并将触发器放在模板中;使用明确的目标元素并将触发器放在模板中(正如其他人所建议的那样);等等。“正确”的方法取决于您是否希望控件在属性更改时做出响应。例如:如果有人直接在TextBox 上设置了一个新的BorderBrush,您是否希望它取代您的橙色悬停效果?值得阅读 value precedence 的依赖属性,以了解某些属性的设置方式和位置的含义。

      值得注意的是,您的模板不完整,如果您希望文本可编辑(或可选择),则该模板将不起作用。 TextBox 期望它的模板有一个特别命名的ScrollViewer,可以在其中注入可编辑的文本视图。尝试将您的 ContentPresenter 替换为以下内容:

      <ScrollViewer x:Name="PART_ContentHost"
                    Padding="{TemplateBinding Padding}" />
      

      注意x:Name 属性必须完全匹配。

      【讨论】:

      • 我不能在文本框中写字,为什么会这样?
      • 因为你的模板不完整。 TextBox 期望它的模板有一个特别命名的滚动查看器,可以在其中注入可编辑的文本视图。尝试用以下内容替换您的ContentPresenter&lt;ScrollViewer x:Name="PART_ContentHost" Padding="{TemplateBinding Padding}" /&gt;。请注意,x:Name 属性必须完全匹配。
      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2016-10-22
      相关资源
      最近更新 更多