将一个 WPF 样式应用到 UserControl 中的一个 Border

4

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

是否有一种方法可以从包含此UserControl的窗口中应用样式到TextBlock上。

我知道我可以创建一个样式..

<Style TargetType='TextBlock'>

但是这适用于窗口中所有 TextBlock,而不仅仅是在我的 UserControl 中的那些。
所以我想说一些像这样的话...
<Style TargetType='MyUserControl.TextBlock'>

谢谢,

Rich。

附注:这是我尝试做的事情的简化示例!

额外说明

今天晚上我在开车回家时,脑海中一直想着这件事,并想到了一个可能的解决方案...那就是创建一个基本的TextBlock控件子类,并称之为MyTextBlock...所以只需要像下面这样定义:

public class MyTextBlock : TextBlock { }

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

也许这不是最整洁的方法,但代码很少,而且它有效。

然而,由于我对WPF相当新,我对更标准的实现方式非常感兴趣。

4个回答

7
如果你想对 MyUserControl 内的所有 TextBlocks 应用一个 Style,可以使用以下方法。
<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内的某些控件设置样式,可以使用DependencyProperties。对于,例如,您可以有一个名为的样式。 将绑定到此

没错,你说得对。我漏掉了<Setter.Value>这一部分...你真是个明星,谢谢@Maleak。 - Rich S
顺便问一下,你看到我主问题上的“附加说明”了吗?我很喜欢那个解决方案,但我猜它更适用于C#而不是WPF。 - Rich S
1
是的,我看到了,并且像你说的那样,我绝对会处理。如果您只想将一个“Style”应用于MyUserControl内部的所有“TextBlocks”,则还有另一种选项,我已经在我的答案中添加了它。如果您想要将另一个“Style”应用于MyUserControl,则只需基于默认的“Style”即可。 - Fredrik Hedblad
@Maleak,你的“更新2”的第一部分正是我正在寻找的!! :-) - Rich S
@RichS:啊,好的 :) 我稍微重新组织了一下我的回答,所以与你的问题最相关的部分出现在了最前面。干杯! - Fredrik Hedblad
显示剩余2条评论

1

我能想到两种方法来实现这个:

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

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

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


谢谢,但我正在寻找一种设置所有用户控件实例中包含的文本块样式的方法,我并不想为每个实例显式地设置它。无论如何还是谢谢。 - Rich S

1

有几件事情可以更改。

首先,您可以使用带有资源键的样式。因此,您可以编写:

<Style x:Key="myTextStyle" TargetType="{x:Type TextBlock">

那么,为了使一个文本框应用这种样式,它需要指定:

<TextBlock Style="{StaticResource myTextStyle" />

如果您不想修改UserControl,并且只想在嵌套UserControl的元素中应用样式,请记住可以在嵌套元素的资源字典中声明样式。当您放置UserControl时,请考虑执行以下操作:

<local:UserControl>
    <local:UserControl.Resources>
        <Style TargetType="{x:Type TextBlock}">
            ...
        </Style>
    </local:UserControl.Resources>
</local:UserControl>

嗨 @Moozhe,你的回答的第二部分非常接近我所需要的..谢谢! - Rich S

0

如果你在XAML中有类似这样的代码:

 <xmlns:local = "myCustonUserControl">

你可以将这个用作样式定义:

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

希望这能帮到你!


这将允许您为整个控件设置样式,而不是控件内的单个元素。 - evanb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接