4

非常に単純なUserControlがあります。これは、Border要素内に含まれるTextBlockのみで構成されています。

含まれているウィンドウからUserControl内のTextBlockにスタイルを適用する方法はありますか?

私はスタイルを作成できることを知っています。

<Style TargetType='TextBlock'>

ただし、これは、UserControl内のTextBlockだけでなく、ウィンドウ内のすべてのTextBlockに適用されます。

だから私は次のようなことを言うことができるようになりたいです...

<Style TargetType='MyUserControl.TextBlock'>

ありがとう、

リッチ。

PS。これは私がやろうとしていることの簡単な例です!

追記

今晩車で家に帰っていたとき、これは頭の中でガタガタと音を立てていました。考えられる解決策を考えました。それは、TextBlockコントロールの基本的なサブクラスを作成し、それをMyTextBlockと呼ぶことです。お気に入り

public class MyTextBlock : TextBlock { }

次に、usercontrol内で、「TextBlock」ではなく「MyTextBlock」を使用します。これにより、「MyTextBlock」のタイプにスタイルを適用できるようになります。ビンゴ!!!

たぶんこれはこれを行うための最もきれいな方法ではありませんが、それは非常に小さなコードであり、それは機能します。

ただし、私はWPFにかなり慣れていないため、これを実現するためのより標準的な方法に非常に興味があります。

4

4 に答える 4

7

内部のStyleすべてにを適用したい場合の1つのオプションはこれですTextBlocksMyUserControl

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

Styleそして、あなたがあなたのために別のものを追加したいのであれば、MyUserControlそれをデフォルトに基づいて行う必要がありますStyle

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

Styleそれ以外の場合、 MyUserControl内の一部のコントロールにを設定できるようにする場合は、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

変更できることがいくつかあります。

まず、リソースキーでスタイルを使用できます。だからあなたは書くでしょう:

<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

私がこれを行うことを考えることができる2つの方法があります:

1つは、スタイルを明示的に設定することにより、包含ウィンドウのコードにあります

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

もう1つの方法は、Textblockスタイルを保持するDependencyPropertyDependencyPropertyを作成し、が変更されたときにそのスタイルをTextBlock要素に適用することです。

于 2012-05-31T17:20:34.770 に答える
0

xamlにこのようなものがある場合:

 <xmlns:local = "myCustonUserControl">

これをスタイル定義として使用できます。

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

お役に立てば幸いです。

于 2012-05-31T17:18:56.533 に答える