从WPF页面在ContentControl中加载内容

6

我正在寻找一种方法,用预定义的页面替换应用程序部分内容。我已经使用了ContentControl,但是我无法复制我的页面内容。我使用的代码是:

ContentControl1.Content = new PageName().Content

我遇到了一个异常,提示指定的元素已经是另一个元素的逻辑子级。请先断开它。

有没有办法在ContentControl中加载页面?

或者,有没有办法使用Visual Studio设计器设计页面并以更容易在ContentControl中加载的方式存储它们?

最后,这会让我的一天,但是否有任何方法可以使ContentControl中的内容调用包含它的Window中声明的方法?

2个回答

4

编辑2:为了能够加载页面,您需要删除内容控件并使用Frame导航窗口

编辑:我再次阅读了问题,并意识到您正在使用一个页面,下面的解决方案仅适用于用户控件。如果您尝试使用Page对象,则仍将出现错误。

为了在内容控件中加载用户控件,您可以尝试以下方法:

ContentControl1.Content = new UserControl();

我认为在控件内部调用主窗口的方法并不是一个好主意,但如果你想这样做,你可以将窗口的实例传递给页面构造函数,并使用它来调用主窗口的方法。


如果更易于维护的话,我可以将“page”更改为“usercontrol”。这仍然可以让我使用设计器并触发主窗口可以绑定的事件。这不是一个坏主意... - Soumya

2

如果窗口要处理用户控件/内容的“事件”,则需要意识到窗口需要预先知道可能被触发的事件。在切换大量页面时,这可能会导致窗口上的处理程序负载很重,也可能会被调用很多次。

一个更好的设计是将数据(模型)存储在窗口中,并在用户控件中设计/编写逻辑以操作数据。您可以通过将数据分配给窗口的DataContext属性来轻松获取数据。加载的用户控件的DataContext将返回数据。

此设置将使代码更易于维护。


再说,这个解决方案可能比之前的更好。我会看看两种方法,看哪一个效果更好。不过在我的情况下,我认为另一种方式更好。 - Soumya
我认为共享数据比共享窗口更加清晰,但当然,这取决于你的选择 ;) - Emond
我明白你的意思。只是在我的情况下,使用另一种解决方案更容易。当然,并不适用于所有人。 - Soumya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接