[英]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.