C# 如何更改WPF中的用户控件?

C# 如何更改WPF中的用户控件?,c#,wpf,C#,Wpf,我正在创建一个类似于向导的东西,我正在使用几个用户控件,但问题是我需要从该元素中获取父控件,以替换下一个用户控件 我该怎么做呢?好吧,有多种方法可以完成向导,但最简单的方法是从主窗体管理用户控件。只需在主窗体中添加一个区域,该区域将是每个用户控件的父控件,然后在必要时从容器中添加/删除用户控件。最优雅的方法是使用选择器或列表框 您的向导将有多个页面,每个页面公开一个或多个信息,从而控制绑定到某些数据的控件。换句话说,你应该考虑有一个包含数据的“模型”,页面将绑定到./p> 现在,考虑每个页面都有

我正在创建一个类似于向导的东西,我正在使用几个用户控件,但问题是我需要从该元素中获取父控件,以替换下一个用户控件


我该怎么做呢?

好吧,有多种方法可以完成向导,但最简单的方法是从主窗体管理用户控件。只需在主窗体中添加一个区域,该区域将是每个用户控件的父控件,然后在必要时从容器中添加/删除用户控件。

最优雅的方法是使用选择器或列表框

您的向导将有多个页面,每个页面公开一个或多个信息,从而控制绑定到某些数据的控件。换句话说,你应该考虑有一个包含数据的“模型”,页面将绑定到./p>

现在,考虑每个页面都有一个不同的模型,并列出这些模型的列表来提供ListBox。此列表框应已定义其ItemTemplateSelector,允许根据项目数据(即模型)选择特定的DataTemplate

该技术最难的部分是为ListBox创建/定义控件模板,该模板的形状应为仅显示选定项(SelectedItem)。这样,您只需更改当前选择,向导页面将自动显示


尽管这项技术看起来有些过分,但相对于“经典”方法,它非常方便。您的代码更干净、更易于调试、可重用,并且提供了模块之间的高度分离。所有这些都将提供更高的可靠性和快速的开发。

让我们假设您有5个用户控件。创建向导时,需要在网格中添加新的UserControl,并从同一父网格中删除以前的UserControl

以下函数将自动删除旧的UserControl并添加新的UserControl。。但是对于第一个UserControl,您可以使用MyParentPanel.Children.add(myFirstUserControl)直接将其添加到其父控件中


希望这对你有帮助

您可能希望查看PRISM以管理视图。它允许您定义主窗口的区域,当您请求导航到其他视图时,它将显示和隐藏您的usercontrol视图。乍一看,这似乎让人望而生畏,但一旦掌握了窍门,您的导航逻辑就会变得更加简单。
       private void AddNewUserControlAndAutoRemoveOldUserControl(UserControl control)
        {
            if (control != null)
            {
                Panel parent = control.Parent as Panel;

                if (parent != null)
                {
                    // Removing old UserControl if present
                    if(parent.Children.Count > 0)
                        parent.Children.RemoveAt(0);

                    parent.Children.Insert(0, control);
                }
            }
        }
}