Link to home
Start Free TrialLog in
Avatar of esc_toe_account
esc_toe_accountFlag for United States of America

asked on

WPF C# Find Window Instance

I have a click event button handler in which I need to find out the instance (not the class) of the window in which the button resides.

I know that Application.Current.MainWindow will tell me the name of the main window but the application launches several windows so there is no guarantee this button click occurred in the main window.

(P.S. the button resides on a page which is held in a frame of the window)

ASKER CERTIFIED SOLUTION
Avatar of Gururaj Badam
Gururaj Badam
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of esc_toe_account

ASKER

Thanks for responding.

((Button)sender.Owner is not valid as Button does not have an Owner property.

And LogicalTreeHelper.GetParent only goes up the tree as far as the page in which the button resides. (Curious as to why it doesn't go up at least to the frame in which in which the page is held?)
Don't know if this is relevant but the page is navigated to using the navigation service:

theWindow.frame.Navigate(myPage);

where the button in question resides on myPage;
Avatar of Ravi Vaddadi
RoutedEventArgs has a property Source which could be type casted to button and use the Parent property of the button

Buttong b = e.Source as Button;
b.Parent as Window;
Not sure what I was looking at before. Of-course, VisualTreeHelper does go all the way up the tree. So your suggestion was accruate. In fact, here is a static method I wrote to browse up the tree looking for a specific type of control object (e.g. Window, Frame, etc.)

public static DependencyObject GetVisualParent(DependencyObject UIObj, string parentType)
        {
            DependencyObject parent = new DependencyObject();
            do
            {
                parent = VisualTreeHelper.GetParent(UIObj);
                if (parent.DependencyObjectType.Name == parentType)
                {
                    return parent;
                }
                UIObj = parent;
            } while (UIObj != null);
                       
            return null;
        }
Oops, somehow I started using VisualTreeHelper, instead of LogicalTreeHelper which you suggested. That must explain why the former worked and the latter stopped at the page reference. Never noticed the difference till I posted the response! Regardless, you got me to the right solution so points still seem appropriate.