2014-12-02 3 views
0

I는 UserControl에서 메인 윈도우에 액세스하는 방법을 발견했다 :액세스 제어

  • 윈도우 parentWindow = Window.GetWindow (이);
  • DependencyObject parentWindow = VisualTreeHelper.GetParent (child);
  • Application.Current.MainWindow as parentWindow;

나는 몇 가지 질문이 있습니다

  1. 제일 위의 방법은 무엇입니까?
  2. 메인 윈도우에서 usercontrol의 컨트롤에 액세스하고 동일한 메인 윈도우에서 usercontrol에서 usercontrol에 액세스하는 방법은 무엇입니까?

감사합니다, 내 나쁜 영어 건너 뛰기 : UserControl 다른 UserControl 내부에 내장되어있는 경우, 당신은 여전히 ​​트리를 통과 Current.MainWindow를 사용할 수 있기 때문에

답변

2

Current.MainWindow이 모든 경우에 이상적입니다. 모든 방법은 훌륭하며 사용법과 수행하려는 작업에 따라 다릅니다.

UserControl 안에 컨트롤에 액세스하려면 (TextBlock). 제안의

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 변환기 (UI를 직접 처리하는 요소)를 코딩 할 때 유용한 경우가 있습니다. xaml 시각적 트리에 크게 의존하기 때문에 코드를 선호하지 않습니다.

당신이 다른 어셈블리에 대한 resuable UserControl을 유지하면서 MainWindowUserControl 사이의 통신 귀하의 UserControl을 하나 이상의 dependency properties을 추가하고 XAML에서 바인딩을 설정하려면

.

빠르고 쉬운 테스트 응용 프로그램을 원한다면 Application.Current.MainWindow는 여전히 좋은 선택입니다.