wpf - Prism +标签=疼痛

标签 wpf prism tabcontrol tabitem

我很难尝试使用 PRISM 2.0 for WPF 获得一个非常简单的场景。我希望我的应用程序的主要工作区是 TabControl .每次添加 View 时,我希望它显示为 TabItemTabControl .

听起来很容易对吧?

我的 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>

这应该设置 HeaderTabItemHeaderInfo 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 包含一个简单的 ImageTextBox ,但它们都没有出现在 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/

相关文章:

使用服务定位器进行单元测试 Prism?

.net - VB.Net 自定义控件

c# - 如何从代码隐藏的用户控件中的内容控件中的数据模板中启动 Storyboard?

c# - ListView 条件分组

c# - 在将对象作为有效负载的 View 模型之间使用Prism 6 Event Aggregator

wpf - 如何删除 TabItem 内容的默认边距?

c# - WPF 错误样式仅在选项卡控件的可见选项卡上正确呈现

.net - 如何使 DockPanel 填充可用空间

c# - 获取在itemSsource内部单击的按钮的ID?

wpf - PRISM WPF - 导航每次都会创建新 View