2

こんにちは。「BasedOn」スタイルが正しく動作しないので、助けを求めています。状況は次のとおりです。

次のように、ResourceDictionary で基本スタイルを定義しています。

スタイル.xaml

<Style TargetType="{x:Type TreeView}" x:Key="MyBaseStyle">
<Style.Resources>
    <HierarchicalDataTemplate ...>
        ...
    </HierarchicalDataTemplate>
    <DataTemplate ...>
        ...
    </DataTemplate>
    <Style TargetType="{x:Type TreeViewItem}">
        ...
    </Style>
</Style.Resources>
<!-- This is for test purpose -->
<Setter Property="Background" Value="Red" />

この辞書を App.xaml に次のようにマージします。

App.xaml

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Styles.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

これは私が以前に行ったことで、メインウィンドウで完全に機能しました:

MainWindow.xaml

<TreeView ... Style="{StaticResource MyBaseStyle}" />

しかし、私のアプリケーションには複数の TreeView があるため、それらに MyBaseStyle を適用し、TreeView ごとに異なる DataTrigger を追加する必要があります。私はこれを試しました:

MainWindow.xaml

<TreeView ...>
    <TreeView.Style>
        <Style TargetType="{x:Type TreeView}" BasedOn="{StaticResource MyBaseStyle}">
            <Style.Triggers>
                <!-- DataTrigger here -->
            </Style.Triggers>
        </Style>
    </TreeView.Style>
</TreeView>

問題は、MyBaseStyle の HierarchicalDataTemplate が機能していないことです。MyBaseStyle の赤い背景が表示され、DataTrigger は正常に機能しますが、テンプレートは機能しません。プログラムが BasedOn スタイルの Style.Resources を無視しているようです??

スタイルスコープの問題である可能性があると思いますが、 TreeView ごとにコードを繰り返さなくても、どうすれば解決できますか? 誰かがすでにこの状況に陥っており、問題の原因を知っていますか?

助けてくれてありがとう、アルノー。

4

1 に答える 1

0

最後に解決策を見つけました。
興味のある方はこちらが詳細です。

Style.Resources で Style を使用する代わりに、各 TreeView に ItemTemplateSelector プロパティを設定します。

<TreeView x:Name="treeView1" ItemsSource="..." ItemTemplateSelector="{StaticResource selector}" />
...
<TreeView x:Name="treeView2" ItemsSource="..." ItemTemplateSelector="{StaticResource selector}" />

ウィンドウリソースに存在する:

<Window.Resources>
    <local:Selector x:Key="selector" />
</Window.Resources>

そして、このように実装されています:

public class Selector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is TreeDirectory) return Application.Current.FindResource("dirTemplate") as HierarchicalDataTemplate;
        if (item is TreeFile) return Application.Current.FindResource("fileTemplate") as HierarchicalDataTemplate;
        return base.SelectTemplate(item, container);
    }
}

セレクターは、項目のタイプに応じて、HierarchicalDataTemplate を返します。これらのテンプレートは (この場合) Application resources にあります。

<Application.Resources>
    <HierarchicalDataTemplate x:Key="dirTemplate" DataType="{x:Type local:TreeDirectory}" ItemsSource="{Binding Children}">
        <TextBlock Foreground="Red" Text="{Binding Name}" />
    </HierarchicalDataTemplate>
    <HierarchicalDataTemplate x:Key="fileTemplate" DataType="{x:Type local:TreeFile}">
        <TextBlock Foreground="Green" Text="{Binding Name}" />
    </HierarchicalDataTemplate>
</Application.Resources>
于 2013-08-14T18:44:00.417 に答える