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

时间:2011-06-19 17:44:00

标签: c# wpf expression-blend

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

我注意到当我鼠标悬停或聚焦TextBox时,WPF的某些默认行为/(样式?)接管并且我的边框发生了变化。

我想知道是否有任何阻止或阻止WPF在我关注或鼠标悬停时更改我的TextBox es样式。这可能吗?

3 个答案:

答案 0 :(得分:18)

您应该使用新模板:

<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 :(得分:17)

更简单的解决方案是将texbox边框粗细设置为0,然后将texbox包装到您自己的边框:

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

答案 2 :(得分:2)

自定义样式是否将OverridesDefaultStyle属性设置为true?我相信这应该可以防止从默认样式中提取默认值。

如果是这样,并且这不起作用(或者你想使用自己的边框),我所能想到的就是你需要覆盖事件的默认样式机制。使用Style / ControlTemplate

中的Trigger更改相应的媒体资源
<Style x:Key="Triggers" TargetType="TextBox">
  <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="true">
        <Setter Property = "BorderBrush" Value="{Binding ToYourBorder}"/>
    </Trigger>
  </Style.Triggers>
</Style>