0

いくつかのカスタム ツリービューを作成しようとしています。これまでのところすべて正常に機能していますが、スタイルに少し問題がありました。ウィンドウのリソースに追加する単純な「RedBackground」スタイルがあります。通常の要素を追加すると、正常に機能します。

カスタム アイテム テンプレートを使用してツリービュー アイテムをレンダリングすると、リソースが無視されます。リソースをテンプレートに直接追加すると、正常に機能します(コードでマークされているように)...

私は明らかに、スタイルを ItemTemplate ディレクトリに追加する必要はありません。今後の開発では非常に複雑になります。ある種の「バインディング」または「ルックアップ」が欠落していると思います...依存関係プロパティに関連していると思います...またはこの方向の何か。

おそらく誰もがより多くの洞察を持っています。これはテンプレートを作成するコードです(utilクラス内ですが、すべてをきれいに保つためだけです):

 var hdt = new HierarchicalDataTemplate(t)
                      {
                          ItemsSource = new Binding("Children")
                      };

        var tb = new FrameworkElementFactory(typeof (TextBlock));
        tb.SetBinding(TextBlock.TextProperty, new Binding("Header"));

        hdt.VisualTree = tb;

        // This way it works...
        TextBlockStyles.AddRedBackground(hdt.Resources);

        return hdt;

そして、ここで私の非常に単純なカスタム ツリー ビュー

    public class TreeViewCustom<T> : TreeView 
{
    public TreeViewCustom()
    {
        MinWidth = 300;
        MinHeight = 600;

        ItemTemplate = TreeViewTemplates.TryGetTemplate(typeof(T));

        // This is ignored.... (Also when set as resource to window)
        TextBlockStyles.AddRedBackground(Resources);
    }
}

わかりました。確かに、スタイルを作成するコードは次のとおりです。

public static class TextBlockStyles
{
    public static void AddRedBackground(ResourceDictionary r)
    {
        var s = CreateRedBackground();
        r.Add(s.TargetType, s);
    }


    private static Style CreateRedBackground()
    {
        var s = new Style(typeof(TextBlock));

        s.Setters.Add(new Setter
        {
            Property = TextBlock.BackgroundProperty,
            Value = new SolidColorBrush(Colors.Red)
        });

        return s;
    }

}

ヒントをありがとう...クリス

4

1 に答える 1

0

これは「継承」の問題ですか?すべてのプロパティが継承されるわけではありません。詳細については、次を参照してください。

プロパティ値の継承: http://msdn.microsoft.com/en-us/library/ms753197.aspx

于 2010-08-31T09:42:12.780 に答える