2

我正在创建一个资源密集型仪表板应用程序,该应用程序将具有许多数据可视化领域。我认为最好使用框架并使用 WPF 页面一次加载所需的页面。这些页面也会有不同的数据上下文、安全限制等。但是,另一位开发人员说我可以使用 TabControl 完成同样的事情。

TabControl 是否在应用程序启动时一次加载所有选项卡中的所有项目?或者,我可以像 WPF 页面一样根据需要延迟加载它们(页面仅在导航到时加载内容)?此外,您可以为 TabControl 中的每个项目设置不同的数据上下文吗?

4

2 回答 2

2

在 WPF 中,您可以使用 UI 虚拟化,这意味着只有可见控件被初始化和呈现。据我所知,TabControl默认情况下不支持 UI 虚拟化,但也许您可以手动添加它或使用其他控件。也许您想看看下面的文章,其中介绍了一些性能提示。还提到 UI 和数据虚拟化之间存在差异。不显示控件并不意味着底层数据不在内存中。您的所有绑定目标都将被加载,但不会呈现控件。

对于您的第二个问题:是的,每个人都TabItem可以拥有自己的DataContext. 如果您使用 TabControlsItemsSource绑定项目列表,则DataContextfor each 将是列表中的TabItem一项。如果你手动添加TabItems,你可以DataContext这样设置:

<TabControl>
    <TabItem DataContext="{Binding Context1}" />
    <TabItem DataContext="{Binding Context2}" />
</TabControl>
于 2012-04-03T19:51:10.190 回答
1

它比你想象的要复杂。如果您绑定到选项卡集合(想想 MVVM),那么选项卡只有在被选中时才会创建。如果您离开一个选项卡并返回一个集合,它会再次构建。如果您在 XAML 中创建选项卡,则这些选项卡都是在加载窗口时构建的。是的,每个选项卡可以有不同的 DataContext。我为延迟加载所做的是绑定到 TabItem 属性 IsSelected,如果它为 false,则类中的所有属性都只返回一个(快速)静态类型兼容的值。如果 IsSelected 更改为 true,则我加载实际值并调用 NotifyPropertyChanged(并保存实际值)。

如果我加载一个大对象并且一个选项卡是一个摘要,我会使用它。选项卡不会虚拟化,但如果您有很大的列表,那么请务必在选项卡中使用虚拟化。您可以使用 BackgroundWorker 创建属性,但一旦它返回并绑定该返回值,UI 就会锁定,直到 UI 控件被呈现。对我来说,单帧与标签的重用是 UI 的事情。只是为了分解代码,我通常会加载带有框架和页面的选项卡(并且我通常将数据传递到 ctor 中的页面以加载动态内容)。

于 2012-04-03T20:37:34.397 回答