簡體   English   中英

將WPF樣式應用於UserControl中的邊框

[英]Apply a WPF style to a Border within a UserControl

我有一個非常簡單的UserControl,它只包含一個Border元素中包含的TextBlock。

有沒有辦法從包含窗口將樣式應用於UserControl中的TextBlock。

我知道我可以用...創建一個風格

<Style TargetType='TextBlock'>

但這適用於我窗口中的所有TextBlocks,而不僅僅是我的UserControl中的TextBlocks

所以我希望能夠說出類似......

<Style TargetType='MyUserControl.TextBlock'>

謝謝,

豐富。

PS。 這是我正在嘗試做的簡化示例!

附加說明

當我今天晚上開車回家的時候,我的腦子里響起了,我想到了一個可能的解決方案......那就是創建一個TextBlock控件的基本子類,並將其命名為MyTextBlock ..所以只需要一個定義喜歡

public class MyTextBlock : TextBlock { }

然后,在usercontrol中,使用“MyTextBlock”而不是“TextBlock”。 這將允許我將樣式應用於“MyTextBlock”類型。 答對了 !!!

也許這不是最簡單的方法,但它的代碼非常少,而且很有效。

但是,由於我對WPF還不熟悉,所以我對一種更為標准的實現方式感興趣。

如果要將Style應用於MyUserControl內的所有TextBlocks這是一個選項

<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中的某些控件設置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>

你可以改變一些事情。

首先,您可以將樣式與資源鍵一起使用。 所以你會寫:

<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>

我有兩種方法可以做到這一點:

一個是在包含窗口的代碼中通過顯式設置樣式

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

另一種方法是創建一個DependencyProperty來保存Textblock樣式,並在更改DependencyProperty時在TextBlock元素上應用樣式。

如果你的xaml中有這樣的東西:

 <xmlns:local = "myCustonUserControl">

您可以將其用作樣式定義:

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

希望有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM