9

<Window.Resources>私は次のスタイルを定義しました:

    <Style x:Key="textBlockStyle" TargetType="TextBlock">
        <Setter Property="Margin" Value="5,0,5,0"/>
    </Style>

TextBlocks4つのグリッドを定義しました。

    <WrapPanel>
        <TextBlock Style="{StaticResource textBlockStyle}">Server</TextBlock>
        <TextBlock Style="{StaticResource textBlockStyle}">IP</TextBlock>
        <TextBlock Style="{StaticResource textBlockStyle}">Port</TextBlock>
        <TextBlock Style="{StaticResource textBlockStyle}">Status</TextBlock>
    </WrapPanel>

問題:textBlockStyle 4 回参照する必要があります。

質問:WrapPanelスタイルへの参照を繰り返さずに、そのスタイルを一度だけ、または別の場所で設定することは可能ですか?

たぶん次のようなもの:

    <WrapPanel Style="{StaticResource textBlockStyle}">
        <TextBlock>Server</TextBlock>
        <TextBlock>IP</TextBlock>
        <TextBlock>Port</TextBlock>
        <TextBlock>Status</TextBlock>
    </WrapPanel>

私はグローバルなソリューションを探しているのではありません! そのプロパティを削除することはできますが、ウィンドウ内のすべてx:Key="textBlockStyle"に影響します。より選択的なメカニズムが必要ですが、その醜いコードの複製は必要ありません。 TextBlocks

4

2 に答える 2

17

ここでは、拡張性の高い順にいくつかのオプションを示します。

オプション1:下位レベルでキーなしでスタイルを定義する

そのレベルでリソースを固定して、WrapPanelその中のコントロールにのみ影響を与えることができWrapPanelます。

<WrapPanel>
    <WrapPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Margin" Value="5,0,5,0"/>
        </Style>
    </WrapPanel.Resources>

    <!-- TextBlocks here -->
</WrapPanel>

キーの欠如に注意してください。これは、内のStyleすべてのに適用されます。TextBlockWrapPanel

オプション2:キーを使用してスタイルを定義し、下位レベルでは定義しない

Styleキーを使用して上位レベルでを定義する場合は、キーを使用Styleせずに下位レベルで別のを定義Styleし、上位レベルのものに基づいて定義できます。

<Window>
    <Window.Resources>
        <Style TargetType="TextBlock" x:Key="textBlockStyle">
            <Setter Property="Margin" Value="5,0,5,0"/>
        </Style>
    </Window.Resources>

    <WrapPanel>
        <WrapPanel.Resources>
            <Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle"/>
        </WrapPanel.Resources>

        <!-- TextBlocks here -->
    </WrapPanel>
</Window>

これにより、Styleは自動的にTextBlockの内側に適用されますWrapPanelが、外側には適用されません。また、-の詳細を複製しないでくださいStyle-それらはより高いレベルで保存されます。

オプション3:スタイルをResourceDictionaryに配置し、選択的にマージします

最後に、をStyle別の場所に配置し、そのディクショナリをコントロールのコレクションResourceDictionaryに選択的にマージできます。Resources

<!-- TextBlockStyles.xaml -->
<ResourceDictionary>
    <Style TargetType="TextBlock">
        <Setter Property="Margin" Value="5,0,5,0"/>
    </Style>
</ResourceDictionary>

<!-- Window.xaml -->
<Window>
    <WrapPanel>
        <WrapPanel.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="TextBlockStyles.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </WrapPanel.Resources>
    </WrapPanel>
</Window>

<!-- Alternative Window.xaml if you have only one RD to merge in -->
<Window>
    <WrapPanel>
        <WrapPanel.Resources>
            <ResourceDictionary Source="TextBlockStyles.xaml"/>
        </WrapPanel.Resources>
    </WrapPanel>
</Window>

これで、必要な数のスタイルセットを個別のディクショナリで定義し、それらを要素ツリーに選択的に適用できます。

于 2009-03-29T15:33:12.220 に答える
2

うん、あなたはそれをすることができます。あなたはほとんど正しい考えを持っています。あなたはこのようにそれをします...

<WrapPanel>
< WrapPanel. Resources >
<Style TargetType="{x:Type TextBlock}">
        <Setter Property="Margin" Value="5,0,5,0"/>
    </Style>
</WrapPanel.Resources/>
        <TextBlock Server</TextBlock>
        <TextBlock >IP</TextBlock>
        <TextBlock >Port</TextBlock>
        <TextBlock >Status</TextBlock>
    </WrapPanel>

{x:type}構文を使用すると、x:keyは不要になり、ラップパネル内のすべてのテキストブロックのスタイルが設定されます。diffスタイルが必要な場合でも、x:keyを使用して、テキストブロックにスタイルを明示的に設定できます。

于 2009-03-29T15:34:44.667 に答える