可以在UserControls中与BasedOn一起使用的未命名样式

时间:2018-06-13 07:47:50

标签: wpf xaml

我正在寻找一种仅限XAML的方法来定义特定Window中的一个未命名样式,该样式影响所有TextBox,甚至是UserControls中的那些TextBox。

这是一个例子:假设我有一个特定的窗口,我想在其中为所有TextBox设置Foreground属性为Red,包括UserControls中包含的那些。我想这样做:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Width="300"
        SizeToContent="Height">
    <Window.Resources>
        <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
            <Style.Setters>
                <Setter Property="Foreground" Value="Red"/>
            </Style.Setters>
        </Style>
    </Window.Resources>
    <StackPanel Orientation="Vertical">
        <TextBox Text="A-Regular"/>
        <TextBox Text="B-Bold">
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
                    <Style.Setters>
                        <Setter Property="FontWeight" Value="Bold"/>
                    </Style.Setters>
                </Style>
            </TextBox.Style>
        </TextBox>
        <local:MyUserControl/>
        <TextBox Text="C-Regular"/>
    </StackPanel>
</Window>

使用过的UserControl如下所示:

<UserControl x:Class="WpfApplication1.MyUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <StackPanel Orientation="Vertical">
        <TextBox Text="Like A, but in UserControl"/>
        <TextBox Text="Like B, but in UserControl">
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
                    <Style.Setters>
                        <Setter Property="FontWeight" Value="Bold"/>
                    </Style.Setters>
                </Style>
            </TextBox.Style>
        </TextBox>
    </StackPanel>
</UserControl>

生成的窗口是:

screenshot of window

一切都很好,除了TextBox&#34;比如B,但是在UserControl&#34;中,它是粗体和黑色。我希望看到红色文本,就像在所有其他TextBox中一样。

有没有办法让Window资源中的未命名样式影响UserControl中的所有TextBox,甚至那些使用BasedOn扩展当前TextBox样式的文本框? 我正在寻找一种方式,我没有适应所有我调用的地方#34; UserControl(即我在窗口中有<local:MyUserControl/>的位置)。我也不想调整UserControl本身,因为它可能在第三方库中。

1 个答案:

答案 0 :(得分:0)

只需将Style放入<Application.Resources>

即可