WPF:除非为样式创建了控件模板,否则控件样式不起作用
这几天几乎让我发疯。我在xaml文件中有一个文本框和样式。 但是没有控件模板的样式无法在textbox上生效。然而,一个控件模板可以工作,但是控件模板似乎完全覆盖了文本框,文本框的默认行为,如编辑、输入或选择。。。 以下是带有控制模板的xaml的内容:WPF:除非为样式创建了控件模板,否则控件样式不起作用,wpf,textbox,styles,controltemplate,Wpf,Textbox,Styles,Controltemplate,这几天几乎让我发疯。我在xaml文件中有一个文本框和样式。 但是没有控件模板的样式无法在textbox上生效。然而,一个控件模板可以工作,但是控件模板似乎完全覆盖了文本框,文本框的默认行为,如编辑、输入或选择。。。 以下是带有控制模板的xaml的内容: <Style TargetType="{x:Type TextBox}"> <Setter Property="Template"> <Setter.Value>
<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>
您没有发布
文本框
代码,但我认为(我也遇到过这种情况),您只是忘记设置文本框的边框厚度
:
<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>
您没有发布文本框
代码,但我认为(我也遇到过这种情况),您只是忘记设置文本框的边框厚度
:
<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>
样式设置器为我工作,但我看到的问题是,控件动画正在设置刚设置的样式的动画
您可能希望提取原始控件模板并重新定义它,而不是完全重新定义它。据我所知,textbox控件不仅仅是一个带有内容展示器的边框(尽管我从未为它提取过控件模板!),而且它可能有两个边框,可以为它提供所有状态等
可以使用Blend执行此操作-如果没有Blend,则可以使用MSDN资源来创建控件模板和样式:
编辑:
首先,在我看来,您缺少重新定义的模板中的内容“部分”
<ScrollViewer Margin="0" x:Name="PART_ContentHost" />
编辑2:
你是说它不起作用。。。这对我使用.NET Framework 4.0在WPF上的工作非常有效-我将边框颜色改为“红色”,以确保我可以看到效果,并且它肯定有效,除了红色会立即褪色之外,因为控件的视觉状态由视觉状态管理器更改(这就是为什么需要编辑控件模板并更改视觉状态)
当您将鼠标悬停在长方体上时,会得到一个红色边框,该边框会立即淡出
这个XAML对你根本不起作用吗?样式设置器对我起作用,但我看到的问题是,控件动画正在动画化刚刚设置的样式
您可能希望提取原始控件模板并重新定义它,而不是完全重新定义它。据我所知,textbox控件不仅仅是一个带有内容展示器的边框(尽管我从未为它提取过控件模板!),而且它可能有两个边框,可以为它提供所有状态等
可以使用Blend执行此操作-如果没有Blend,则可以使用MSDN资源来创建控件模板和样式:
编辑:
首先,在我看来,您缺少重新定义的模板中的内容“部分”
<ScrollViewer Margin="0" x:Name="PART_ContentHost" />
编辑2:
你是说它不起作用。。。这对我使用.NET Framework 4.0在WPF上的工作非常有效-我将边框颜色改为“红色”,以确保我可以看到效果,并且它肯定有效,除了红色会立即褪色之外,因为控件的视觉状态由视觉状态管理器更改(这就是为什么需要编辑控件模板并更改视觉状态)
当您将鼠标悬停在长方体上时,会得到一个红色边框,该边框会立即淡出
这个XAML对您根本不起作用吗?您的样式确实起作用,在没有模板的样式中设置一个属性,如Background
,您将看到它确实得到了应用。但是,与前面提到的其他人一样,您没有看到任何更改的原因是TextBox
的默认WPF控件模板中存在动画(动画值始终优先于本地值、设置器和触发器)。当您重新定义控件模板时,这些动画不再存在,因此您的示例可以正常工作。您可以使用默认的TextBox
模板,并根据您的目的对其进行修改(可在此处找到:) 您的样式确实有效,在没有模板的样式中设置一个属性,如Background
,您将看到它确实得到了应用。但是,李