将WPF样式应用于UserControl中的边框

Ric*_*h S 3 c# silverlight wpf styles

我有一个非常简单的UserControl,它只包含一个Border元素中包含的TextBlock.

有没有办法从包含窗口将样式应用于UserControl中的TextBlock.

我知道我可以用...创建一个风格

<Style TargetType='TextBlock'>
Run Code Online (Sandbox Code Playgroud)

但这适用于我窗口中的所有TextBlocks,而不仅仅是我的UserControl中的TextBlocks

所以我希望能够说出类似......

<Style TargetType='MyUserControl.TextBlock'>
Run Code Online (Sandbox Code Playgroud)

谢谢,

丰富.

PS.这是我正在尝试做的简化示例!

附加说明

当我今天晚上开车回家的时候,我的脑子里响起了,我想到了一个可能的解决方案......那就是创建一个TextBlock控件的基本子类,并将其命名为MyTextBlock ..所以只需要一个定义喜欢

public class MyTextBlock : TextBlock { }
Run Code Online (Sandbox Code Playgroud)

然后,在usercontrol中,使用"MyTextBlock"而不是"TextBlock".这将允许我将样式应用于"MyTextBlock"类型.答对了 !!!

也许这不是最简单的方法,但它的代码非常少,而且很有效.

但是,由于我对WPF还不熟悉,所以我对一种更为标准的实现方式感兴趣.

Fre*_*lad 6

如果你想Style在所有TextBlocks内部应用一个选项,这MyUserControl是一个选项

<Style TargetType="{x:Type my:MyUserControl}">
    <Style.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Foreground" Value="Blue"/>
        </Style>
    </Style.Resources>
</Style>
Run Code Online (Sandbox Code Playgroud)

如果你想StyleMyUserControl你添加另一个,你只需要将它作为默认值Style

<Style x:Key="myStyle" TargetType="{x:Type my:MyUserControl}"
       BasedOn="{StaticResource {x:Type my:MyUserControl}}">
    <!-- ... -->
</Style>
Run Code Online (Sandbox Code Playgroud)

否则,如果您希望能够Style在MyUserControl中设置某些控件,则可以使用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> 
Run Code Online (Sandbox Code Playgroud)

MyUserControl.xaml

<Border BorderThickness="1">
    <TextBlock Style="{Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}},
                               Path=TextBlockStyle}"
               Text="Test"/>
</Border>
Run Code Online (Sandbox Code Playgroud)

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); }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以设置Style在标记中声明实例的时间

<my:MyUserControl>
    <my:MyUserControl.TextBlockStyle>
        <Style TargetType="TextBlock">
            <Setter Property="Foreground" Value="Green"/>
        </Style>
    </my:MyUserControl.TextBlockStyle>
</my:MyUserControl>
Run Code Online (Sandbox Code Playgroud)

更新

要在资源级别设置此项,您可以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>
Run Code Online (Sandbox Code Playgroud)