代码之家  ›  专栏  ›  技术社区  ›  Mark Denom

为什么我的文本框对控件模板样式中的IsMouseOver没有反应

  •  0
  • Mark Denom  · 技术社区  · 7 年前

    所以我试着给我的文本框设计一点样式,我的想法是当我在文本框上悬停的时候我想给边框画笔设计一个样式,但是由于某些原因它没有改变边框,所以我也试着改变背景,同样的事情。那时我才意识到它对 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>
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   mm8    7 年前

    TargetName 和一个 BorderThickness

    <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 边界厚度 它的属性 0

        2
  •  1
  •   Klaus Gütter    7 年前

    要更改边框的背景,请为边框指定一个名称,并将TargetName=“MyBorder”添加到Setter中

        3
  •  1
  •   Mike Strobel    7 年前

    您正在使用自定义 Template ,但模板不应用模板的边框属性 TextBox . 尝试将以下内容添加到 Border

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

    实际上有几种方法可以做到这一点:使用模板绑定并将触发器放在 Style ; 使用模板绑定并在模板中放置触发器;使用一个显式的目标元素并将触发器放在模板中(正如这里的其他人所建议的);“正确”的方法取决于属性更改时控件的响应方式。例如:如果有人设置了一个新的 BorderBrush 直接在 ,你想让它取代你的橙色悬停效果吗?值得一读 value precedence 以了解如何以及在何处设置某些属性的含义。

    值得注意的是,如果您希望文本是可编辑的(或可选择的),那么您的模板是不完整的,无法工作。A. 文本框 期望它的模板有一个特别命名的 ScrollViewer 可插入可编辑文本视图的位置。试着替换你的 ContentPresenter

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

    请注意 x:Name

    推荐文章