我有一个非常简单的UserControl,它只包含一个Border元素中包含的TextBlock。
是否有一种方法可以在包含窗口的UserControl中将样式应用于TextBlock。
我知道我可以用..创建一个风格
<Style TargetType='TextBlock'>
但是这适用于我窗口中的所有TextBlocks,而不仅仅是我的UserControl中的TextBlock
所以我希望能够说出类似......
<Style TargetType='MyUserControl.TextBlock'>
谢谢,
富
PS。这是我正在尝试做的简化示例!
今天晚上我开车回家的时候,脑袋里响起来了,我想到了一个可能的解决方案......那就是创建一个TextBlock控件的基本子类,并将其命名为MyTextBlock ..所以有一个像
这样的定义public class MyTextBlock : TextBlock { }
然后,在usercontrol中,使用“MyTextBlock”而不是“TextBlock”。这将允许我将样式应用于“MyTextBlock”类型。宾果!!!“
也许这不是最简单的方法,但这只是很少的代码,而且很有效。
然而,由于我对WPF还不熟悉,所以我对更为标准的实现方式感兴趣。
答案 0 :(得分:6)
如果您想将Style
应用于TextBlocks
内的所有MyUserControl
,则可选择
<Style TargetType="{x:Type my:MyUserControl}">
<Style.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Blue"/>
</Style>
</Style.Resources>
</Style>
如果您想为Style
添加另一个MyUserControl
,则必须将其基于默认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>
<强>更新强>
要在资源级别设置此项,您可以在窗口资源或App.xaml中添加MyUserControl
的默认样式,例如
<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>
答案 1 :(得分:1)
您可以更改一些内容。
首先,您可以将样式与资源键一起使用。所以你会写:
<Style x:Key="myTextStyle" TargetType="{x:Type TextBlock">
然后,为了让TextBox应用此样式,需要指定:
<TextBlock Style="{StaticResource myTextStyle" />
如果您不想修改UserControl,并且只想将样式应用于将UserControl嵌套在其中的元素中,请记住,您可以在嵌套元素的资源字典中声明样式。放置UserControl时,请考虑这样做:
<local:UserControl>
<local:UserControl.Resources>
<Style TargetType="{x:Type TextBlock}">
...
</Style>
</local:UserControl.Resources>
</local:UserControl>
答案 2 :(得分:1)
我有两种方法可以考虑这样做:
一个是在包含窗口的代码中通过显式设置样式
MyUserControl.TextBlockName.Style = FindResource("TextBlockStyle") as Style;
另一种方法是创建一个DependencyProperty来保存Textblock样式,并在更改DependencyProperty
时在TextBlock元素上应用样式。
答案 3 :(得分:0)
如果你的xaml中有这样的东西:
<xmlns:local = "myCustonUserControl">
您可以将其用作样式定义:
<Style TargetType="{x:Type local:MyUserControl}">
希望有所帮助!