4

次の XAML (簡略化) があります。

<Window ...

    <Window.Resources>
        <Style TargetType="{x:Type TextBlock}" >
            <Setter Property="FontSize" Value="28" />
            <Setter Property="Margin" Value="3" />
            <Setter Property="Foreground" Value="Green" />
        </Style>
    </Window.Resources>

    <StackPanel>

        <ListBox ItemsSource=...
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" >
                        <TextBlock Text="{Binding Index}" />
                        <TextBlock Text="-" />
                        <TextBlock Text="{Binding Hours, StringFormat={}{0:00}}" />
                        <TextBlock Text=":" />
                        <TextBlock Text="{Binding Minutes, StringFormat={}{0:00}}" />
                        <TextBlock Text=":" />
                        <TextBlock Text="{Binding Seconds, StringFormat={}{0:00}}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        ...

このコードでは、Window.Resources で定義された Style は DataTemplate 内の TextBlock には適用されませんが、Window の他の TextBlocks には適用されます。

Style をコピーして、次のように DataTemplate リソースに設定すると:

        <DataTemplate.Resources>
            <Style TargetType="{x:Type TextBlock}" >
                <Setter Property="FontSize" Value="28" />
                <Setter Property="Margin" Value="3" />
                <Setter Property="Foreground" Value="Green" />
            </Style>
        </DataTemplate.Resources>

その後、動作します。なぜスタイルを複製する必要があるのですか?

前もって感謝します。

4

3 に答える 3

4

暗黙的は、テンプレートから継承Stylesする型にのみ適用され、それから直接継承するため、機能しません。スタイルを指定して明示的に使用するか、スタイルを宣言する必要がありますが、それはすべてに適用されます。つまり、基本的にアプリケーション全体で表示されるすべてのテキストビットを意味しますSystem.Windows.Controls.ControlTextBlockSystem.Windows.FrameworkElementx:KeyApplication.ResourcesTextBlocks

于 2013-10-03T08:36:51.473 に答える
3

それはWPFの癖です。Controlコントロールが からではなく から直接継承する場合FrameworkElement、テンプレート内の暗黙的なスタイル ルックアップはアプリケーション リソースに直接スキップされます。スタイルをアプリケーション リソース ( App.xaml) に配置すると、機能します。

または、名前付きリソースを使用しBasedOnて参照することもできます。

    <DataTemplate.Resources>
        <Style TargetType="TextBlock" BasedOn="{StaticResource MyTextStyle}" />
    </DataTemplate.Resources>
于 2013-10-03T08:36:33.570 に答える
2

DataTemplate と Style Confusionをご覧ください。

これは、2006 年 10 月に Connect に「バグ」として投稿しました。

...

「この動作は「設計による」ものであり、これが理由です。テンプレートはカプセル化の境界として表示されます。これらのテンプレートによって生成された要素は、この境界内に収まります。一致する TargetType を持つスタイルの検索は、この境界で停止します。したがって、テンプレートを介して作成された repro は問題の Style を取得しませんが、テンプレートの外部で定義された TextBlock は取得します。

この問題を回避する 1 つの方法は、スタイルに明示的な名前を付け、テンプレート内の TextBlock でこの名前でスタイルを参照することです。

于 2013-10-03T08:42:40.340 に答える