c# - WPF User Control Parent

ID : 20230

viewed : 11

Tags : c#.netwpfc#

Top 5 Answer for c# - WPF User Control Parent

vote vote

97

Try using the following:

Window parentWindow = Window.GetWindow(userControlReference); 

The GetWindow method will walk the VisualTree for you and locate the window that is hosting your control.

You should run this code after the control has loaded (and not in the Window constructor) to prevent the GetWindow method from returning null. E.g. wire up an event:

this.Loaded += new RoutedEventHandler(UserControl_Loaded);  
vote vote

84

I'll add my experience. Although using the Loaded event can do the job, I think it may be more suitable to override the OnInitialized method. Loaded occurs after the window is first displayed. OnInitialized gives you chance to make any changes, for example, add controls to the window before it is rendered.

vote vote

78

Use VisualTreeHelper.GetParent or the recursive function below to find the parent window.

public static Window FindParentWindow(DependencyObject child) {     DependencyObject parent= VisualTreeHelper.GetParent(child);      //CHeck if this is the end of the tree     if (parent == null) return null;      Window parentWindow = parent as Window;     if (parentWindow != null)     {         return parentWindow;     }     else     {         //use recursion until it reaches a Window         return FindParentWindow(parent);     } } 
vote vote

63

I needed to use the Window.GetWindow(this) method within Loaded event handler. In other words, I used both Ian Oakes' answer in combination with Alex's answer to get a user control's parent.

public MainView() {     InitializeComponent();      this.Loaded += new RoutedEventHandler(MainView_Loaded); }  void MainView_Loaded(object sender, RoutedEventArgs e) {     Window parentWindow = Window.GetWindow(this);      ... } 
vote vote

58

If you are finding this question and the VisualTreeHelper isn't working for you or working sporadically, you may need to include LogicalTreeHelper in your algorithm.

Here is what I am using:

public static T TryFindParent<T>(DependencyObject current) where T : class {     DependencyObject parent = VisualTreeHelper.GetParent(current);     if( parent == null )         parent = LogicalTreeHelper.GetParent(current);     if( parent == null )         return null;      if( parent is T )         return parent as T;     else         return TryFindParent<T>(parent); } 

Top 3 video Explaining c# - WPF User Control Parent

Related QUESTION?