去除文本框默认的鼠标悬停/焦点效果

22

我在Expression Blend中创建了一种自定义的TextBox。 我将背景和边框的填充改为渐变,并添加了阴影效果。

我注意到当我将鼠标悬停或聚焦于我的TextBox时,WPF的某些默认行为或样式会接管并更改我的边框。

我想知道是否有任何方法可以防止或停止WPF在我聚焦或悬停时更改我的TextBox样式。 这是否可能?

3个回答

39

更简单的解决方案是将文本框边框厚度设置为0,然后将文本框包裹在您自己的边框中:

<Border BorderBrush="LightGray" BorderThickness="1">
   <TextBox Text="{Binding OutlinePlain, Mode=TwoWay, NotifyOnTargetUpdated=True}"
                         BorderThickness="0"                                
   </TextBox>
</Border>

19

你应该使用一个新的模板:

<Style TargetType="{x:Type TextBox}">
  <Setter Property="SnapsToDevicePixels" Value="True"/>
  <Setter Property="OverridesDefaultStyle" Value="True"/>
  <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
  <Setter Property="AllowDrop" Value="true"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type TextBoxBase}">
        <Border 
          Name="Border"
          CornerRadius="2" 
          Padding="2"
          Background="#FFFFFF"
          BorderBrush="#888888"
          BorderThickness="1" >
          <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsEnabled" Value="False">
            <Setter TargetName="Border" Property="Background" Value="#EEEEEE"/>
            <Setter TargetName="Border" Property="BorderBrush" Value="#EEEEEE"/>
            <Setter Property="Foreground" Value="#888888"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

我移除了触发器IsMouseOver

查看此处以获取更多信息:TextBox Styles and Templates


1
OverridesDefaultStyle 非常重要,必须包含。 - Just code

8
你的自定义样式是否将OverridesDefaultStyle属性设置为true?我认为这应该可以防止从默认样式中绘制默认值。
如果是这样,并且这不起作用(或者你想使用自己的边框),我唯一能想到的就是你需要使用Style/ControlTemplate中的触发器来覆盖适当属性更改的默认样式机制。
<Style x:Key="Triggers" TargetType="TextBox">
  <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="true">
        <Setter Property = "BorderBrush" Value="{Binding ToYourBorder}"/>
    </Trigger>
  </Style.Triggers>
</Style>

我该如何创建一个边框的绑定? - mattsven
首先,您是否检查了您的样式是否使用了<Setter Property="OverridesDefaultStyle" Value="True"/>?如果是这样,您是否已经将背景定义为StaticResource - Grant Thomas
是的,OverridesDefaultStyle 被设置为 true。至于背景,不,它被设置为动态资源 - <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>。更改它没有任何影响。 - mattsven
@NeXXeuS:抱歉,“background”是个打错字,我指的是你的边框。你的边框设置方式是否相同?如果是的话,请将引用方式复制到触发器设置器中。 - Grant Thomas
虽然之前的尝试没有成功,但我发现了一个有趣的事情——移除<Microsoft_Windows_Themes:ListBoxChrome>中的RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}"代码片段后,我得到了想要的行为。不过,我的做法是否正确呢? - mattsven
1
@NeXXeus:我不能说你做的是“坏”的,因为你似乎删除了与“ListBox”相关的内容,所以现在你可能会注意到其他样式“丢失”了-看看它的表现如何。 - Grant Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接