将 WPF 样式应用于用户控件中的边框
本文关键字:边框 控件 用户 WPF 样式 应用于 | 更新日期: 2023-09-27 18:35:50
我有一个非常简单的用户控件,它只包含一个包含在 Border 元素中的 TextBlock。
有没有办法从包含窗口将样式应用于用户控件中的文本块。
我知道我可以用..
<Style TargetType='TextBlock'>
但这适用于我的窗口中的所有文本块,而不仅仅是我的用户控件中的文本块
所以我希望能够说这样的话...
<Style TargetType='MyUserControl.TextBlock'>
谢谢
富。
这是我想做的一个简化的例子!
附加说明
今天晚上我开车回家时,这在我的脑海里嘎嘎作响,我想到了一个可能的解决方案......那就是创建 TextBlock 控件的基本子类,并称之为 MyTextBlock。
public class MyTextBlock : TextBlock { }
然后,在用户控件中,使用"MyTextBlock"而不是"TextBlock"。这将允许我将样式应用于"MyTextBlock"类型。宾果游戏!!!
也许这不是最整洁的方法,但它的代码很少,而且有效。
但是,由于我对 WPF 相当陌生,因此我对实现此目的的更标准方法非常感兴趣。
如果要将Style
应用于MyUserControl
中的所有TextBlocks
,则有一个选项是
<Style TargetType="{x:Type my:MyUserControl}">
<Style.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Blue"/>
</Style>
</Style.Resources>
</Style>
如果你想为MyUserControl
添加另一个Style
,你只需要把它建立在默认的Style
<Style x:Key="myStyle" TargetType="{x:Type my:MyUserControl}"
BasedOn="{StaticResource {x:Type my:MyUserControl}}">
<!-- ... -->
</Style>
否则,如果您希望能够为 MyUserControl 中的某些控件设置Style
,则可以使用 DependencyProperties。例如,对于TextBlock
,您可以拥有一个名为TextBlockStyle
的样式。TextBlock
将绑定到此Style
,您可以从窗口(或使用它的任何位置)设置Style
。这也可以在框架中的一些控件中看到,例如AutoCompleteBox
工具包中的
<toolkit:AutoCompleteBox>
<toolkit:AutoCompleteBox.TextBoxStyle>
<Style TargetType="TextBox">
<Setter Property="MaxLength" Value="10"/>
</Style>
</toolkit:AutoCompleteBox.TextBoxStyle>
</toolkit:AutoCompleteBox>
MyUserControl.xaml
<Border BorderThickness="1">
<TextBlock Style="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}},
Path=TextBlockStyle}"
Text="Test"/>
</Border>
MyUserControl.xaml.cs
public partial class MyUserControl : UserControl
{
public static DependencyProperty TextBlockStyleProperty =
DependencyProperty.Register("TextBlockStyle",
typeof(Style),
typeof(MyUserControl));
public MyUserControl()
{
InitializeComponent();
}
public Style TextBlockStyle
{
get { return (Style)GetValue(TextBlockStyleProperty); }
set { SetValue(TextBlockStyleProperty, value); }
}
}
然后,当您在标记中声明实例时设置Style
<my:MyUserControl>
<my:MyUserControl.TextBlockStyle>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Green"/>
</Style>
</my:MyUserControl.TextBlockStyle>
</my:MyUserControl>
更新
要在资源级别设置此设置,您可以为 MyUserControl
添加默认样式,例如在窗口资源或 App.xaml 中
<Window.Resources>
<Style TargetType="{x:Type my:MyUserControl}">
<Setter Property="TextBlockStyle">
<Setter.Value>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Green"/>
</Style>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
您可以更改一些内容。
首先,可以将样式与资源键一起使用。 所以你会写:
<Style x:Key="myTextStyle" TargetType="{x:Type TextBlock">
然后,为了使文本框应用此样式,它需要指定:
<TextBlock Style="{StaticResource myTextStyle" />
如果不想修改 UserControl,而只想在嵌套 UserControl 的元素中应用样式,请记住,您可以在嵌套元素的资源字典中声明样式。 放置用户控件时,请考虑执行以下操作:
<local:UserControl>
<local:UserControl.Resources>
<Style TargetType="{x:Type TextBlock}">
...
</Style>
</local:UserControl.Resources>
</local:UserControl>
我能想到两种方法:
一种是在包含窗口中的代码中,通过显式设置样式
MyUserControl.TextBlockName.Style = FindResource("TextBlockStyle") as Style;
另一种方法是创建一个 DependencyProperty 来保存 Textblock 样式,并在更改DependencyProperty
时将该样式应用于 TextBlock 元素。
如果你的 xaml 中有这样的东西:
<xmlns:local = "myCustonUserControl">
您可以将其用作样式定义:
<Style TargetType="{x:Type local:MyUserControl}">
希望对您有所帮助!