WPF:弹出现有用户控件

时间:2015-04-22 14:47:24

标签: c# wpf xaml user-controls

想象一下下一个情况:我的应用程序窗口里面有几个用户控件。它们在过去并排显示,但现在我想在弹出窗口中显示其中一个。不是在弹出窗口控件而是新窗口。

参见示例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而无需重新创建呢?

1 个答案:

答案 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();
}