我很难尝试使用 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>

这应该设置 HeaderTabItemHeaderInfo 财产在 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 环顾四周,我会发现看不到任何图像。

我在这里缺少什么 - 有更简单的方法吗?

有帮助吗?

解决方案

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

在我看来,除非你对PRISM,模型和XAML有深刻的理解,否则它既脆弱又易于破坏,并且相当容易破解。幸运的是,有一种更好,更简单的方法:

只需创建一个名为 TabRegionView 的视图,其中只包含一个空白的TabControl。您可能希望将其添加到Shell.xaml中。创建名为 InjectTabView 的事件,其具有UserControl类型的Payload,并在 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 选取,视图将作为新标签添加。您可以轻松地将View包含在包含标题文本,图像和bool的某些类型的线束中,以指示是否应自动选择该选项卡。

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

我非常有兴趣从任何PRISM officianados获得对此的意见。

其他提示

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

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

看起来很傻,但如果你不这样做,你会得到你所看到的行为。我发现这有点令人沮丧,但它很容易修复。如果您至少不激活添加的第一个视图,则添加多个选项卡时,行为甚至更加奇怪。

我的理解是,如果你不这样做,视图永远不会成为可视化树的一部分(这是TabControl在标签没有时停用(从可视树中删除)这一事实的副作用t“在前面”。这对某些操作很有用,但是这样的事情有点不稳定。

一些随意的想法:

  • 尝试从 TabControl 中删除样式
  • 在以下的帮助下检查视觉树 史努比 工具。您应该在 TabControl 下看到带有视图 UserControl 的 TabItem。接下来,您可以检查该 UserControl 及其子控件(您的视图的内容)有什么问题。它们可能由于某种原因被隐藏。
  • 其他需要考虑的事情 - RegionAdapter。RegionAdapters 负责调整区域的视图以承载 UIControl。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top