最近几天这让我很生气。我有一个文本框和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>
答案 0 :(得分:2)
样式设置器对我有用,但我看到的问题是控件动画正在动画刚刚设置的样式。
您可能想要提取原始控件模板并重新定义它而不是完全重新定义它。据我所知,文本框控件比内容呈现器的边框更复杂(我从来没有为它提取控件模板!)它可能有几个边框可以实现它的所有状态等
你可以使用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起作用 - 我将边框颜色更改为'Red'而不是确保我能看到效果并且它绝对有效,一边从红色褪色立即因为控件视觉状态被视觉状态管理器改变(这就是你需要编辑控件模板并改变视觉状态的原因)
<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根本不适合你吗?
答案 1 :(得分:1)
您没有发布TextBox
代码,但我认为(我也遇到过)您忘记设置BorderThickness
的{{1}}:
textbox
答案 2 :(得分:1)
你的风格确实有效,在没有模板的情况下在你的风格中设置Background
这样的属性,你会发现它确实应用了。但是,就像其他人提到的那样,您没有看到任何更改的原因是因为TextBox
的默认WPF控件模板中的动画(动画值始终优先于本地值,设置器和触发器)。重新定义控件模板时,这些动画不再存在,因此您的示例可以正常工作。你可以做的是采用默认的TextBox
模板并根据你的目的修改它(可以在这里找到:http://msdn.microsoft.com/en-us/library/cc645061%28VS.95%29.aspx)。