【发布时间】: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