我很难尝试使用 PRISM 2.0 for WPF 获得一个非常简单的场景。我希望我的应用程序的主要工作区是 TabControl
.每次添加 View 时,我希望它显示为 TabItem
在 TabControl
.
听起来很容易对吧?
我的 Shell.XAML 中的区域如下所示:
<Controls:TabControl
Name="MainRegion"
cal:RegionManager.RegionName="{x:Static Infrastructure:RegionNames.TabRegion}"
ItemContainerStyle="{StaticResource ShellTabItemStyle}" />
风格:
ShellTabItemStyle
看起来像这样:<Style x:Key="ShellTabItemStyle" TargetType="{x:Type TabItem}">
<Setter Property="Header" Value="{Binding Content.DataContext.HeaderInfo, RelativeSource={RelativeSource Self}}" />
</Style>
这应该设置
Header
的TabItem
到HeaderInfo
DataContext
上的属性(property)的看法。 (我从 this article 得到这个想法) DataContext
我的观点是一个非常简单的Presenter
其中有一个 HeaderInfo
属性:public string HeaderInfo = "The Header Text";
我的 View 是一个简单的 WPF 用户控件,如下所示:
<StackPanel>
<TextBox Text="Hello World" Name="MyTextBox"></TextBox>
<Image Source="..SomeImage.PNG" Name="MyImage"></Image>
</StackPanel>
到现在为止还挺好。如果我将 View 添加到该区域,我会得到一个选项卡控件,并且我会得到一个选项卡,其文本设置为“标题文本”。我的问题是标签上绝对没有内容。我的 View 包含一个简单的
Image
和 TextBox
,但它们都没有出现在 TabItem
.如果我打开 Snoop 并环顾四周,则看不到任何图像。我在这里错过了什么 - 有没有更简单的方法?
最佳答案
我无法获得任何建议的工作答案。广泛的谷歌搜索也没有帮助。周末我对这个问题进行了一些思考,我想的越多,我就越觉得有一点 代码气味 关于这种方法。您将 View 注入(inject)您的选项卡区域...发生了一些神奇的事情并添加了一个选项卡...您必须向存储在某处文件中的某些 XAML 样式添加一些难以理解的动态绑定(bind),这可能会或可能不会设置您的标题文本.如果其中任何一个元素有一点点错误,您将不会收到错误,但它不会起作用。
在我看来,除非您对 PRISM、模型和 XAML 有深入的了解,否则这既脆弱(即非常容易破坏)又非常难以理解。幸运的是,有一种更好更简单的方法可以做到这一点:
只需创建一个名为 TabRegionView 的 View ,其中仅包含一个空白 TabControl。您可能希望将此添加到您的 Shell.xaml。创建一个名为 InjectTabView 的事件,该事件具有 UserControl 类型的有效负载,并在您的 TabRegionView 控件中订阅此事件。当事件在 TabRegionView 中触发时,您手动创建 TabItem 并将 View 添加到 TabItem,如下所示:
public void TabAdded(UserControl view)
{
var item = new TabItem();
item.Content = view;
item.IsSelected = true;
item.Header = "Header Text";
mainTab.Items.Add(item);
}
当您想将 View 显示为新选项卡时,您的代码如下所示:
var view = new View(params);
_eventAggregator.GetEvent<InjectTabViewEvent>()
.Publish(view);
这将由 TabRegionView 拾取, View 将添加为新选项卡。您可以轻松地将 View 包装在某种类型的线束中,其中包含标题文本、图像和 bool 值,以指示是否应自动选择选项卡。
恕我直言,这种技术具有双重优势,可以让您直接控制正在发生的事情,并且更容易遵循。
我很想从任何 PRISM 官员那里得到意见。
关于wpf - Prism +标签=疼痛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1614420/