2014-12-02 5 views
0

я нашел методы, чтобы получить доступ главного окна из UserControl:управления содержимым из главного окна

  • Окно ParentWindow = Window.GetWindow (этого);
  • DependencyObject parentWindow = VisualTreeHelper.GetParent (дочерний элемент);
  • Application.Current.MainWindow as parentWindow;

У меня есть несколько вопросов:

  1. Какой из перечисленных методов является лучшим?
  2. Как я могу получить доступ к управлению в usercontrol из главного окна и от usercontrol до usercontrol в том же главном окне?

Спасибо, Пропустить мой плохой английский :)

ответ

2

Current.MainWindow идеально подходит в каждом конкретном случае, потому что если UserControl встроен в другой UserControl, вы все еще можете использовать Current.MainWindow перемещения вверх по дереву. Все методы в порядке, и все зависит от использования и того, что вы пытаетесь выполнить.

Для доступа к управлению (скажем TextBlock) внутри UserControl.

TextBlock tb = FindVisualChildren<TextBlock>(usercontrol) 

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
{ 
    if (depObj != null) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
      if (child != null && child is T) 
      { 
       yield return (T)child; 
      } 

      foreach (T childOfChild in FindVisualChildren<T>(child)) 
      { 
       yield return childOfChild; 
      } 
     } 
    } 
} 
1

Ни один из предложенных не «лучше»:

Application.Current.MainWindow или Window.GetWindow(this): не хорошо, так как вы нарушаете с общими шаблонами проектирования и правил (например, «принцип инверсии зависимостей» или MVVM)

Использование VisualTreeHelper иногда полезно при кодировании преобразователей XAML (таких элементов, которые непосредственно связаны с пользовательским интерфейсом). Не рекомендуется в коде, поскольку вы сильно зависите от своего дерева визуализации xaml.

Если вы хотите общаться между MainWindow и UserControl, сохраняя resuable UserControl для других сборок, добавить один или несколько dependency properties к вашему UserControl, и установить привязки в XAML.

Если вы хотите быстро и легко тестировать приложения, убедитесь, что Application.Current.MainWindow по-прежнему является хорошим выбором.

Смежные вопросы