0

現在、WPFTreeViewディスプレイに取り組んでいます。このTreeViewのコンテンツは、通常のデータバインディングからのものです。

<TreeView HorizontalAlignment="Stretch" 
      x:Name="LogMonitor" 
      VerticalAlignment="Stretch"
      ItemsSource="{Binding LogEntries, UpdateSourceTrigger = PropertyChanged }">
    <TreeView.Resources>
        <HierarchicalDataTemplate 
                DataType="{x:Type Log:SystemLog}"
                ItemsSource="{Binding Path=Lines}">
                <TextBlock Text="{Binding Header}"/>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

TreeViewはキーワードでフィルタリングされますが、TreeViewに残っているすべてのTreeViewItemに対してキーワードを強調表示したいと思います。

たとえば、ヘッダーが「これはリンゴです」のTreeViewItemがあり、ユーザーがフィルタリングキーワードとして「apple」と入力した場合、TreeViewItemは次のように表示されます。

ハイライト

私はいくつかのアプローチを試しましたが、あまり運がありません。

  1. 組み込みのスタイリングの使用:
    強調表示には、文字列の照合と、照合されたサブ文字列の下にカラーブロックを配置する必要があります。そのように衣装を着せることができる組み込みのスタイルテンプレートはないようです。

  2. ViewModelオブジェクトでキャンバスに描画し、キャンバスをTreeViewItemにバインドします。
    これは、TreeViewItemが選択されていない場合にのみ機能します。選択すると、組み込みの描画呼び出しは、キャンバスを「ハイライト」スタイルでペイントする方法を見つけることができず、そのままにします。空白の領域。

  3. TreeViewItemのサブクラスを作成し、OnRender関数をオーバーライドしてから、TreeViewのItemContainerGeneratorを置き換えて、TreeViewItemのサブクラスを返します。
    不可能です。TreeViewのItemContainerGeneratorは設定可能ではなく、非仮想です。

    そして、私はもう1つのオプションしか考えられません:

  4. データバインディングをあきらめ、OnRender関数をオーバーライドしたTreeViewItemのサブクラスを自分でTreeViewのアイテムリストにプッシュします。

それは私に実験で肯定的な結果を与えます。しかし、データバインディングパラダイムを削除することに不快感を覚えます。ですから、データバインディングのプレゼントを使ってオーナーが描く方法は他にありますか。

ありがとうございました。

4

1 に答える 1

0

テキストを 3 つの領域 (プレハイライト、ハイライト、およびポスト ハイライト) に分割するユーザー コントロールを作成します。これはすべて、標準のバインディングとスタイリングで行うことができます。各 TreeViewItem は、これらのコントロールの 1 つになります。

于 2012-11-20T03:00:14.910 に答える