Reputation: 615
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
Upvotes: 0
Views: 123
Reputation: 169190
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;
}
}
Upvotes: 1