简体   繁体   中英

How to Find UserControl Parent?

I want to find the parent of usercontrol from Markup, I used the following code

var hostRoot = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
var host = hostRoot.RootObject;

var do = host as DependencyObject;
var uc = do as UserControl;
var ucParent = uc.Parent;

and

var wp = Window.GetWindow(uc);

But both return null

Update:

<Window x:Class="WpfApp12.MainWindow">
    <Grid>
       <local:UserControl1/>
    </Grid>
</Window>

and

<UserControl x:Class="WpfApp12.UserControl1">
    <StackPanel>
       
        <TextBlock Text="{me:myMarkup}"/>

    </StackPanel>
</UserControl>

Update 2:

this is my Markup

public class myMarkup : MarkupExtension
    {
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var hostRoot = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
            var host = hostRoot.RootObject;
            var xv = host as DependencyObject;

            var ww = Window.GetWindow(xv);
            return null;
        }
    }

Update 3: sample project

https://github.com/ghost1372/HandyControls/files/6259944/WpfApp18.zip

You need to wait until the UserControl has been loaded before calling Window.GetWindow :

public class myMarkup : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var hostRoot = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
        var host = hostRoot.RootObject;
        var xv = host as FrameworkElement;

        //local function:
        void OnLoaded(object sender, RoutedEventArgs e)
        {
            FrameworkElement xv = (FrameworkElement)sender;
            Window parentWindow = Window.GetWindow(xv);
            //do something with the window...
        }

        Window parentWindow;
        if (xv.IsLoaded)
        {
            parentWindow = Window.GetWindow(xv);
            //do something with the window...
        }
        else
        {
            xv.Loaded += OnLoaded;
        }

        return null;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM