0

最近几天它几乎让我生气。我有一个文本框和 xaml 文件中的样式。但是没有控件模板的样式不能在文本框上生效。然而,控件模板有效,但控件模板似乎完全覆盖了文本框,文本框的默认行为丢失,例如编辑、输入或选择......这是带有控件模板的 xaml 的内容:

   <Style TargetType="{x:Type TextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Border Name="tbBorder"  Background="White"  BorderThickness="0.6" BorderBrush="#B9B9B9">
                        <ContentPresenter/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsFocused" Value="true">
                            <Setter Property="BorderBrush" Value="#4D90FE" />
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="BorderBrush" Value="#4D90FE" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

这是根本不起作用的简单样式,

    <Style TargetType="{x:Type TextBox}">
       <Style.Triggers>
            <Trigger Property="IsFocused" Value="true">
                <Setter Property="BorderBrush" Value="#4D90FE" />
            </Trigger>
            <Trigger Property="IsMouseOver" Value="true">
                <Setter Property="BorderBrush" Value="#4D90FE" />
            </Trigger>
        </Style.Triggers>
    </Style>

谢谢!

更新:整个文本框的代码片段:

       <TextBox Height="23" HorizontalAlignment="Left" Margin="114,53,0,0" Name="textBox1" VerticalAlignment="Top" Width="150" Text="{Binding Path=TraderAccount, Mode=OneWayToSource, NotifyOnValidationError=True}" BorderBrush="#FFB9B9B9" BorderThickness="1" >
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Style.Triggers>
                        <Trigger Property="IsFocused" Value="true">
                            <Setter Property="BorderBrush" Value="Red" />
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="BorderBrush" Value="Red" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
4

3 回答 3

2

样式设置器对我有用,但我看到的问题是控件动画正在动画化刚刚设置的样式。

您可能想要提取原始控件模板并重新定义它,而不是完全重新定义它。据我所知,文本框控件比带有内容演示器的边框更复杂(尽管我从未提取过它的控件模板!)并且它可能有几个边框可以为其提供所有状态ETC

您可以使用 Blend 来执行此操作 - 在没有 Blend 的情况下,有用于控件模板和样式的 MSDN 资源:

http://msdn.microsoft.com/en-us/library/aa970773.aspx

编辑:

对于初学者来说,在我看来,您在重新定义的模板中缺少内容“PART”

<ScrollViewer Margin="0" x:Name="PART_ContentHost" />

编辑2:

您是说它不起作用...这对我使用 .NET Framework 4.0 在 WPF 上有效-我将边框颜色更改为“红色”,以确保我可以看到效果并且它肯定有效,除了红色立即淡出,因为控件的视觉状态由视觉状态管理器更改(这就是您需要编辑控件模板并更改视觉状态的原因)

<TextBox>  
    <TextBox.Style>  
        <Style TargetType="TextBox">  
            <Style.Triggers>  
                <Trigger Property="IsFocused" Value="true">  
                    <Setter Property="BorderBrush" Value="Red" />  
                </Trigger>  
                <Trigger Property="IsMouseOver" Value="true">  
                    <Setter Property="BorderBrush" Value="Red" />  
                </Trigger>  
            </Style.Triggers>  
        </Style>  
    </TextBox.Style>  
</TextBox>  

当您将鼠标悬停在该框上时,您会看到一个立即消失的红色边框

这个 XAML 根本不适合你吗?

于 2012-10-09T09:43:32.030 回答
1

您的样式确实有效,Background在没有模板的情况下设置您的样式中的属性,您会看到它确实被应用了。但是,就像其他人提到的那样,您看不到任何更改的原因是因为默认 WPF 控件模板中的TextBox动画(动画值始终优先于本地值、设置器和触发器)。当您重新定义控件模板时,这些动画不再存在,因此您的示例有效。您可以做的是采用默认TextBox模板并对其进行修改以适合您的目的(可以在此处找到:http: //msdn.microsoft.com/en-us/library/cc645061%28VS.95%29.aspx)。

于 2012-10-09T16:29:10.637 回答
1

您没有发布TextBox代码,但我认为(它也发生在我身上)您只是忘记设置BorderThickness您的textbox

<TextBox BorderThickness="4">
        <TextBox.Style>
            <Style TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <Trigger Property="IsFocused" Value="true">
                        <Setter Property="BorderBrush" Value="#4D90FE" />
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="BorderBrush" Value="#4D90FE" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>
于 2012-10-09T09:38:15.357 回答