如何在运行时使用替换的ControlTemplate设置WPF控件的属性
本文关键字:ControlTemplate 设置 控件 属性 WPF 替换 运行时 | 更新日期: 2023-09-27 18:00:15
我有许多在运行时生成的TextBoxes。当执行某个操作时,我想将它们的边框刷颜色设置为绿色,并更改边框厚度。在我的情况下,这必须从后面的代码中完成。
我的第一个挑战是用鼠标悬停时阻止TextBox边框的颜色变化。这是通过添加以下样式来实现的:
<UserControl.Resources>
<Style TargetType="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"
Padding="1"
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>
<Style TargetType="TreeViewItem">
<Setter Property="Template" Value="{StaticResource TreeViewWithLines}"/>
<Setter Property="Padding" Value="0,5,0,5"/>
<Setter Property="IsExpanded" Value="true"/>
</Style>
</UserControl.Resources>
<ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto">
<TreeView Name="tvFilters" Margin="0,10,0,10" Background="White" BorderBrush="White"/>
</ScrollViewer>
</UserControl>
以上代码适用于我的UserControl。
接下来,一个新的问题开始出现。每当我试图在代码隐藏方法中手动更改BorderBrush和BorderThickness属性时,绝对不会发生任何问题。这是代码:
txt.BorderThickness = new Thickness(3);
txt.BorderBrush = Brushes.Green;
有什么想法吗?
尝试将其作为控制模板:
<ControlTemplate TargetType="{x:Type TextBoxBase}">
<Border
Name="Border"
Padding="1"
Background="#FFFFFF"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}" >
<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>
您可以通过比较两者来猜测:您正在对为TextBox
可视化子树生成的Border
的值进行硬编码。处理此问题的方法是将可视化的属性值绑定到控件的属性值。创建TemplateBinding
就是为了做到这一点。
另外,请注意,虽然我已经为您提供了答案,但您并没有真正以充分利用其设计的方式使用WPF。在运行时生成控件最好使用DataTemplate
。