想象一下下一个情况:我的应用程序窗口里面有几个用户控件。它们在过去并排显示,但现在我想在弹出窗口中显示其中一个。不是在弹出窗口控件而是新窗口。
参见示例XAML:
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfApplication3="clr-namespace:WpfApplication3"
Title="MainWindow"
Height="350"
Width="525">
<Grid>
<wpfApplication3:UserControl1 Visibility="Hidden"
x:Name="UserControl1"/>
<Button Click="ButtonBase_OnClick"
Width="100"
Height="60">open window</Button>
</Grid>
在后面的代码中,我需要从当前Window中取消附加usercontrol并分配给新的:
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
var parent = VisualTreeHelper.GetParent(UserControl1);
if (parent != null)
{
parent.RemoveChild(UserControl1);
}
var w = new Window
{
Content = UserControl1,
Title = "sample",
SizeToContent = SizeToContent.WidthAndHeight,
ResizeMode = ResizeMode.CanResize
};
w.Show();
}
在调用w.Show()后,我总是得到空白的白色窗口。
如果在按钮中单击处理程序更改
Content = UserControl1
到
Content = new UserControl1()
我也会得到正确的内容。 但我无法使用这种方式,因为我想在弹出和弹出事件期间保持我的usercontrol状态。 那么如何在新窗口中显示现有的usercontrol而无需重新创建呢?
答案 0 :(得分:1)
我不确定您是如何在DependencyObject上调用RemoveChild的,因为该方法似乎不存在。请注意VisualTreeHelper.GetParent返回DependencyObject,因此,除非在某处定义RemoveChild的Extension方法,否则您发布的代码不应编译。
在您的情况下,您要做的是将您的父对象转换为Grid或Panel类型,然后从Children属性中删除UserControl,然后将UserControl设置为窗口的内容。
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
Grid parent = VisualTreeHelper.GetParent(UserControl1) as Grid;
if (parent != null)
{
parent.Children.Remove(UserControl1);
}
var w = new Window
{
Content = UserControl1,
Title = "sample",
SizeToContent = SizeToContent.WidthAndHeight,
ResizeMode = ResizeMode.CanResize
};
w.Show();
}