【问题标题】:How to Find UserControl Parent?如何找到 UserControl 父级?
【发布时间】:2021-04-05 17:43:44
【问题描述】:

我想从 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

【问题讨论】:

  • 我不会使用 do 作为变量名,因为这是一个 C# 关键字。关于这个问题,你的uc 设置是什么?因为如果父级为空,则表明用户控件尚未添加到元素树中。
  • 忘记命名这只是一个例子,Usercontrol在Window里面
  • 我认为您的代码没有任何明显的问题,我可以看到。上传示例项目可能会有所帮助。
  • 嘿,看来您正试图在 InitializeComponent 完成之前访问逻辑树。 InitializeComponent 构建逻辑树,包括从 XAML 初始化父级。您将无法像这样访问它。如果你能解释你想要做什么,也许有可能以另一种方式实现它?
  • @ekke 我用 Application.Current.MainWindow 不太好,但也不错

标签: c# wpf user-controls


【解决方案1】:

你需要等到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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多