4

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

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

我知道我可以用..

<Style TargetType='TextBlock'>

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

所以我希望能够说类似的话...

<Style TargetType='MyUserControl.TextBlock'>

谢谢,

富有的。

PS。这是我正在尝试做的一个简化示例!

附加说明

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

public class MyTextBlock : TextBlock { }

然后,在用户控件中,使用“MyTextBlock”而不是“TextBlock”。这将允许我将样式应用于“MyTextBlock”类型。答对了 !!!

也许这不是最整洁的方法,但它的代码很少,而且可以工作。

但是,由于我对 WPF 还很陌生,所以我对实现这一目标的更标准的方式非常感兴趣。

4

4 回答 4

7

如果您想将 aStyle应用于所有TextBlocks内部,一个选项MyUserControl是这个

<Style TargetType="{x:Type my:MyUserControl}">
    <Style.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Foreground" Value="Blue"/>
        </Style>
    </Style.Resources>
</Style>

如果您想StyleMyUserControl您添加另一个,只需将其基于默认值Style

<Style x:Key="myStyle" TargetType="{x:Type my:MyUserControl}"
       BasedOn="{StaticResource {x:Type my:MyUserControl}}">
    <!-- ... -->
</Style>

否则,如果您希望能够为StyleMyUserControl 中的某些控件设置 a,您可以使用 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>
于 2012-05-31T20:20:52.703 回答
1

您可以更改一些内容。

首先,您可以将 Styles 与资源键一起使用。所以你会写:

<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>
于 2012-05-31T17:19:09.060 回答
1

我可以想到两种方法:

一种是通过显式设置样式在包含窗口中的代码中

MyUserControl.TextBlockName.Style = FindResource("TextBlockStyle") as Style;

另一种方法是创建一个DependencyProperty来保存 Textblock 样式,并在更改时将样式应用于 TextBlock 元素DependencyProperty

于 2012-05-31T17:20:34.770 回答
0

如果您的 xaml 中有类似的内容:

 <xmlns:local = "myCustonUserControl">

您可以将其用作样式定义:

 <Style TargetType="{x:Type local:MyUserControl}">

希望有帮助!

于 2012-05-31T17:18:56.533 回答