为什么我的文本框对ControlTemplate的样式中的IsMouseOver没有反应

时间:2018-11-05 14:04:24

标签: c# .net wpf mvvm resourcedictionary

因此,我尝试对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>

3 个答案:

答案 0 :(得分:1)

要更改边框的背景,请为边框命名,并将TargetName =“ MyBorder”添加到设置器中

答案 1 :(得分: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的{​​{1}}属性设置为BorderThickness以外的其他属性,否则不会存在。

答案 2 :(得分:1)

您使用的是自定义return new Scaffold( appBar: new AppBar(), body: new RefreshIndicator( onRefresh: _onRefresh, child: new PageView.builder( scrollDirection: Axis.horizontal, itemCount: a.length, itemBuilder: (context, index) { return new Center( child: Text(a[index].toString()), ); }, ), ) ); ,但是您的模板未应用模板化的Template的border属性。尝试将以下内容添加到模板中的TextBox元素中:

Border

实际上,您可以通过几种方法来实现:使用模板绑定并将触发器放入BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" 中;使用模板绑定并将触发器放入模板中;使用明确的目标元素,并将触发器放入模板(如此处其他建议);等。“正确”方法取决于更改属性时控件如何/是否希望响应。例如:如果有人直接在Style上设置了新的BorderBrush,您是否希望它取代您的橙色悬停效果?值得阅读value precedence的依赖项属性,以了解如何以及在何处设置某些属性的含义。

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

ContentPresenter

请注意,<ScrollViewer x:Name="PART_ContentHost" Padding="{TemplateBinding Padding}" /> 属性必须完全匹配。