是否可以将UserControl初始化为要在ContentControl中使用的StaticResource

时间:2014-12-11 11:53:56

标签: c# xaml user-controls blend win-universal-app

我正在努力为Windows平台编写通用应用程序,我试图尝试制作其中一个时髦的新单页应用程序。

但是,我想尽可能重复使用我的代码,以便遵循DRY原则,不要重复任何我不需要的代码。

因此,我已经制作了许多用户控件(它们都能正常工作)并且我试图将它们嵌入到Xaml ContentControl 中最终允许我在运行时将不同的ContentControl对象交换进出视图。

到目前为止,在我的实验中,我有以下代码:

XAML:

<ContentControl x:Name="CentralContextHost" Style="{StaticResource ContentControlStyle}">
  <!-- The following tag is which ever user control I wish to host -->
  <Universal:CentralHubControl/>
</ContentControl>

我用来操作上述XAML的代码:

public object CurrentControl; // field

if (CurrentControl == null)
  CurrentControl = new Profile(); // another usercontrol

var tempswap = CentralContextHost.Content;
CentralContextHost.Content = CurrentControl;
CurrentControl = tempswap;

然而,我想通过使用类似于我在其他地方使用的绑定语法的东西来尝试使我的代码更清晰,可能在某种类型的xaml对象的字典中创建我的控件作为静态资源,然后只丢弃一个类似的减速到我的xaml中正确位置的绑定,以便根据需要显示它们。

我遇到的问题是,我不确定如何解决这个问题,或者是否有一种方法可以解决它。我的想法是能够做类似于以下虚构代码的事情。

<Universal:CentralHubControl x:Key="CentralHub" />
<Universal:Profile x:Key="PersonProfile" />

<ContentControl
  x:Name="CentralContextHost"
  Grid.RowSpan="2"
  Content="{StaticResource CentralHub}"
  Style="{StaticResource ContentControlStyle}">

这似乎适用于混合,但在运行时使用时会崩溃。

任何人都可以在这里看到为什么会出现这种情况或者我可能做错了什么?

如果您需要更多信息,请在评论中询问并告诉我,我很乐意在这里找到这两个问题的答案。

1 个答案:

答案 0 :(得分:1)

我自己还没有玩过一个包含所有内容的应用程序。如果我这样做,也许我可能会建议使用面板作为您的内容主机,而不是 contentcontrol

例如,如果您要将Grid作为布局的根目录,默认情况下通常是。然后,您可以使用以下代码行将用户控件直接添加到后面代码中的面板:

rootLayout.Children.Add(AnyUIElement).

以这种方式执行操作可以创建所需用户控件的新实例,并可能为其维护状态。

对于 MVVM 风格的解决方案,我将不得不玩这个概念。

您是否需要使用我可能没有考虑的内容控件