FrameworkElementFactory "игнорирует" родительские ресурсы (например, стили) - PullRequest
0 голосов
/ 12 ноября 2009

Я пытаюсь создать несколько пользовательских видов дерева. Пока все работает нормально, но у меня возникла небольшая проблема со стилями. У меня есть простой стиль "RedBackground", который я добавляю к ресурсам окна. При добавлении нормальных элементов все работает нормально.

При использовании пользовательского шаблона элемента для отображения элементов в виде дерева мой ресурс игнорируется. Если я добавлю ресурс непосредственно в шаблон, он будет работать нормально (как отмечено в коде) ...

Я, очевидно, не хочу добавлять стили к директиве ItemTemplate, это будет очень сложно в дальнейшей разработке. Я думаю, что мне не хватает какой-то «Binding» или «Lookup» ... Я думаю, что это связано со свойствами зависимости ... Или что-то в этом направлении.

Возможно, у кого-то есть больше идей, вот код, создающий шаблон (внутри класса 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;
    }

}

Спасибо за любые советы ... Chris

1 Ответ

0 голосов
/ 31 августа 2010

Это проблема с "наследованием"? Не все свойства унаследованы, подробнее здесь:

Значение свойства Наследование: http://msdn.microsoft.com/en-us/library/ms753197.aspx

...