Как вы можете получить доступ к элементу управления в ControlTemplate в Silverlight? - PullRequest
1 голос
/ 11 января 2012

У меня есть следующий код:

ControlTemplate ct = (ControlTemplate)XamlReader.Load(validXmlString);

Теперь мне нужно получить элемент управления, который этот шаблон создал, в моем случае, кнопку.Я искал повсюду и не могу найти простое объяснение того, как это делается.

Обратите внимание, что по какой-то необъяснимой причине Microsoft предоставила метод FindControl () для ControlTemplate в WPF, но не в Silverlight.Я читал, что это можно сделать с помощью VisualTreeHelper, но мне еще предстоит выяснить, как это сделать.

1 Ответ

1 голос
/ 11 января 2012

Ниже вы найдете пример, который рекурсивно просматривает дерево визуалов и находит все кнопки, добавляющие их в коллекцию. Вы можете проверить название кнопки и т. Д. И сделать то, что вам нужно сделать. Я просто использовал коллекцию в качестве примера, поскольку нашел на ней быстрый образец.

public MainPage()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    }

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        List<UIElement> buttons = new List<UIElement>();

        GetChildren(this, typeof(Button), ref buttons);
    }

    private void GetChildren(UIElement parent, Type targetType, ref List<UIElement> children)
    {
        int count = VisualTreeHelper.GetChildrenCount(parent);
        if (count > 0)
        {
            for (int i = 0; i < count; i++)
            {
                UIElement child = (UIElement)VisualTreeHelper.GetChild(parent, i);
                if (child.GetType() == targetType)
                {
                    //DO something with the button in the example added to a collection. You can also verify the name and perform the action you wish.
                    children.Add(child);
                }
                GetChildren(child, targetType, ref children);
            }
        }
    }

Надеюсь, это поможет

...