4

我很难尝试使用 PRISM 2.0 for WPF 获得一个非常简单的场景。我希望我的应用程序的主要工作区是TabControl. 每次添加视图时,我都希望它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>

这应该将 的 设置Header为视图TabItemHeaderInfo属性。DataContext(我从这篇文章中得到了这个想法)DataContext我的观点是一个非常简单Presenter的,它有一个HeaderInfo属性:

public string HeaderInfo = "The Header Text";

我的视图是一个简单的 WPF 用户控件,如下所示:

  <StackPanel>
    <TextBox Text="Hello World" Name="MyTextBox"></TextBox>
    <Image Source="..SomeImage.PNG" Name="MyImage"></Image>
  </StackPanel>

到现在为止还挺好。如果我将视图添加到该区域,我会得到一个选项卡控件,并且我会得到一个选项卡,其文本设置为“标题文本”。我的问题是标签上绝对没有内容。我的视图包含一个简单的Image和一个TextBox,但它们都没有出现在TabItem. 如果我打开 Snoop 并环顾四周,则看不到任何图像。

我在这里错过了什么 - 有没有更简单的方法?

4

3 回答 3

3

我无法获得任何建议的工作答案。广泛的谷歌搜索也没有帮助。我在周末对这个问题进行了一些思考,我想得越多,我就越觉得这种方法有点代码味道。您将视图注入您的选项卡区域...发生了一些神奇的事情并添加了一个选项卡...您必须向存储在某处文件中的某些 XAML 样式添加一些难以理解的动态绑定,这可能会或可能不会设置您的标题文本. 如果其中任何一个元素有一点点错误,您将不会收到错误,但它不会起作用。

在我看来,除非您对 PRISM、模型和 XAML 有深入的了解,否则这既脆弱(即非常容易破坏)又非常难以理解。幸运的是,有一种更好更简单的方法可以做到这一点:

只需创建一个名为TabRegionView的视图,其中仅包含一个空白 TabControl。您可能希望将此添加到您的 Shell.xaml。创建一个名为InjectTabView的事件,该事件具有 UserControl 类型的有效负载,并在您的TabRegionView控件中订阅此事件。当事件在TabRegionView中触发时,您手动创建 TabItem 并将视图添加到 TabItem 中,如下所示:

public void TabAdded(UserControl view)
{
    var item = new TabItem();
    item.Content = view;
    item.IsSelected = true;
    item.Header = "Header Text";
    mainTab.Items.Add(item);
}

当您想将视图显示为新选项卡时,您的代码如下所示:

    var view = new View(params);
    _eventAggregator.GetEvent<InjectTabViewEvent>()
        .Publish(view);

这将由TabRegionView拾取,视图将添加为新选项卡。您可以轻松地将视图包装在某种类型的线束中,其中包含标题文本、图像和布尔值,以指示是否应自动选择选项卡。

恕我直言,这种技术具有双重优势,可以让您直接控制正在发生的事情,并且更容易遵循。

我很想从任何 PRISM 官员那里得到意见。

于 2009-10-26T12:15:27.777 回答
2

如果您使用的是 RegionManager,则需要激活您的视图。可能有一些代码将视图添加到区域,您只需要告诉该区域激活它。

public void AddViewToRegion(IRegion region, object view)
{
     region.Add(view);
     region.Activate(view);
}

这看起来很愚蠢,但如果你不这样做,你就会得到你所看到的行为。我发现这有点令人沮丧,但它很容易解决。如果您至少没有激活您添加的第一个视图,那么当您添加多个选项卡时,这种行为会更加奇怪。

我的理解是,如果你不这样做,那么视图永远不会成为视觉树的一部分(这是当TabControl停用(从Visual树中删除)时的事实的副作用前”。这对某些操作很有用,但会使这样的事情有点不稳定。

于 2009-10-23T17:34:32.520 回答
0

一些随意的想法:

  • 尝试从 TabControl 中删除样式
  • 借助Snoop工具检查可视化树。您应该在 TabControl 下看到带有视图 UserControl 的 TabItem。接下来,您可以检查该 UserControl 及其子项(您的视图的内容)有什么问题。它们可能由于某种原因被隐藏了。
  • 其他需要考虑的事情 - RegionAdapter。RegionAdapters 负责调整区域的视图以承载 UIControl。
于 2010-09-13T17:17:51.943 回答