首页 > 解决方案 > 如何找到 UserControl 父级?

问题描述

我想从 Markup 中找到 usercontrol 的父级,我使用了以下代码

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;

var wp = Window.GetWindow(uc);

但两者都返回 null

更新:

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

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

    </StackPanel>
</UserControl>

更新 2:

这是我的标记

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;
        }
    }

更新 3:示例项目

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

标签: c#wpfuser-controls

解决方案


在调用之前,您需要等到UserControl已加载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;
    }
}

推荐阅读