1

У меня есть следующий код:Как вы можете получить доступ к элементу управления в ControlTemplate в Silverlight?

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

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

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

+0

Вы действительно не должны делать это ... –

+0

Бесполезного ответ, Silverlight массово недостатков в реализации DataGrid, и он оставил меня * нет * выбора, но не делать это. У вас есть знания, как это сделать? Если да, поделитесь им. –

+0

Нет выбора? Может быть, вы что-то игнорируете, чего вы пытаетесь достичь в целом? –

ответ

1

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

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); 
      } 
     } 
    } 

Надеется, что это помогает