【问题标题】:Remove default mouseover/focus effect on textboxes删除文本框上的默认鼠标悬停/焦点效果
【发布时间】:2011-06-19 17:44:00
【问题描述】:

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

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

我想知道当我聚焦或将鼠标悬停在 WPF 上时,是否有任何方法可以阻止或阻止 WPF 更改我的 TextBoxes 样式。这可能吗?

【问题讨论】:

    标签: c# wpf expression-blend


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您应该使用新模板:

      <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

      【讨论】:

      • OverridesDefaultStyle 包含非常重要
      【解决方案3】:

      您是否自定义样式将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>
      

      【讨论】:

      • 如何创建与边框的绑定?
      • 首先,您是否检查过您的样式是否使用&lt;Setter Property="OverridesDefaultStyle" Value="True"/&gt;?如果是这样,您是否将您的背景定义为StaticResource
      • 是的,OverridesDefaultStyle 设置为 true。至于背景,不,它设置为 DynamicResource - &lt;Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/&gt;。改变它没有区别。
      • @NeXXeuS:抱歉,“背景”是一个错字,我指的是你的边界。您的边框设置方式是否相同?如果是,则将引用的方式复制到触发器设置器中。
      • @NeXXeus:我不能说你所做的是否 - 你删除的内容似乎与ListBox有关,所以你可以现在请注意其他样式“缺失” - 看看情况如何。
      猜你喜欢
      • 2011-04-20
      • 2013-06-15
      • 2013-01-17
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      相关资源
      最近更新 更多