如何在WPF / C#中创建可选项内容?

我的WPF应用程序中有一个TabControl 。 我希望我的应用程序基本上支持单个程序中的多个“实例”。 例如,考虑一下Web浏览器,它们允许您在不同的选项卡中拥有多个网站实例,我希望实现类似的function,其中我的应用程序包含多个“子应用程序”实例。

我目前面临的问题是我必须将相同的XAML复制粘贴到每个选项卡,因为每个选项卡具有完全相同的标记和UI,但数据不同。 另一个问题是我需要动态创建这些选项卡的function。

这是我的应用程序在当前状态下的屏幕截图。 如您所见,顶部有2个选项卡,第二个选项卡具有透明背景,因为它处于非活动状态。

在此处输入图像描述

那么,我如何创建一个可选项的系统,其中选项卡的UI对于每个选项卡保持相同,我只需要使用一个XAML UI进行开发并为每个选项卡复制该选项卡?

要求:

  • 每个选项卡都具有相同的UI。
  • 每个选项卡都有不同的UI元素数据。
  • 作为开发人员,我想在Visual Studio中只在一次和右侧处理选项卡的XAML。

理想情况下,我会喜欢一个简单的简单示例项目/代码,其中有一个没有样式的选项卡控件,启动时应用程序动态创建2-n选项卡,这些选项卡都具有相同的UI,但具有不同的数据。

正如另一个答案中所指出的,可能有很多方法可以做到这一点,但这是我的简单方法:

定义DataTemplate,定义每个相同选项卡的内容。 数据模板中的控件将绑定到当前所选选项卡的视图模型。 我在我的示例中添加了一个TextBlock,但您可以轻松扩展它。

使用这个Xaml:

            

而这个视图模型代码:

 public class TabBindingViewModels { public TabBindingViewModels() { Items = new ObservableCollection { new TabBindingViewModel(1), new TabBindingViewModel(2), new TabBindingViewModel(3), }; } public IEnumerable Items { get; private set; } } public class TabBindingViewModel { public TabBindingViewModel() : this(0) { } public TabBindingViewModel(int n) { Header = "I'm the header: " + n.ToString(CultureInfo.InvariantCulture); Content = "I'm the content: " + n.ToString(CultureInfo.InvariantCulture); } public string Header { get; set; } public string Content { get; set; } } 

我们得到:

在此处输入图像描述

我非常喜欢这个关于选项卡控件样式的教程 。 您可以轻松地将更复杂的内容放入选项卡标题和内容中。

您应该检查选项卡控件的完整模板,以深入了解它的工作原理。 使用Blend或VS11 beta提取模板。

为了动态添加/删除选项卡,现在您需要做的就是向ObservableCollection视图模型添加/删除项目。

这实际上可以变成一个相当大的答案,因为你可以采取许多不同的路径。

重要的是要理解TabControl是ItemsControl ,这意味着它可以包含一组对象,例如构成每个模块的UserControl。 因此,您可以将Items属性绑定到一些UserControl对象的ObservableCollection {T} ,这些对象位于某个模块项目内部,该项目实现了来自Prism的IModule等接口。 界面定义了可以在选项卡中加载的任何模块的起点。 在请求模块时,您只需加载程序集并添加一个选项卡,其中包含对模块中定义的区域的引用。

这实际上并不是很困难,但我建议你阅读Prism,因为它会为你处理很多繁重的工作。 我最近经历的构建界面与您使用Prism描述的界面完全相同。

查看Caliburn.Micro,了解基于MVVM框架的解决方案。 您要问的确切问题可在其中一个示例解决方案中解决。

http://caliburnmicro.codeplex.com/

如果没有更多信息,我的方法是在每个实例或选项卡的ApplicationDomain中启动MVVM提供程序。 当您终止/关闭选项卡时,请卸载应用程序域。