gpt4 book ai didi

wpf - TabControl 处理非事件选项卡上的控件

转载 作者:行者123 更新时间:2023-12-04 22:17:07 28 4
gpt4 key购买 nike

我正在为我的应用程序使用 MVVM 模式。 MainWindow 包含一个 TabControl,其中 DataContext 映射到 ViewModel:

<Window.Resources>
<ResourceDictionary>
<DataTemplate x:Key="templateMainTabControl">
<ContentPresenter Content="{Binding Path=DisplayName}" />
</DataTemplate>

<local:ViewModel x:Key="VM" />
<local:WorkspaceSelector x:Key="WorkspaceSelector" />
<local:TabOneView x:Key="TabOneView" />
<local:TabTableView x:Key="TabTableView" />

<DataTemplate x:Key="TabOne">
<local:TabOneView />
</DataTemplate>

<DataTemplate x:Key="TabTable">
<local:TabTableView />
</DataTemplate>

</ResourceDictionary>
</Window.Resources>


<TabControl Grid.Row="0"
DataContext="{StaticResource VM}"
ItemsSource="{Binding Workspaces}"
SelectedItem="{Binding SelectedWorkspace}"
ItemTemplate="{StaticResource templateMainTabControl}"
ContentTemplateSelector="{StaticResource WorkspaceSelector}" />

WorkspaceSelector 看起来像:

public class WorkspaceSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate( object item, DependencyObject container )
{
Window win = Application.Current.MainWindow;
Workspace w = ( Workspace ) item;
string key = w.DisplayName.Replace( " ", "" );
if ( key != "TabOne" )
{
key = "TabTable";
}
return win.FindResource( key ) as DataTemplate;
}
}

以便 TabOne 返回 DataTemplateTabOne 和其他两个选项卡返回 DataTemplate TabTable

如果我运行该应用程序并单击每个选项卡两次(1、2、3、1、2、3),我没有得到我期望的结果,即


TabOne的 View 创建完成
TabTwo的view创建完成
TabOne的View创建完成
TabTwo的 View 创建完毕

也就是说,如果 TemplateSelector 返回不同的值,则现有选项卡的控件将被丢弃并创建新选项卡的控件,如果 TemplateSelector 返回相同的值值,没有任何反应。

这正是我不想要的!我希望 TabControl 将所有控件保留在选项卡上,并且我希望能够在我从 TabTwo< 转到的情况下在代码中创建不同的控件TabThree。我可以没有后者。但是,如何告诉 TabControl 在未选中时不要丢弃每个选项卡的控件?

最佳答案

这是 TabControl 的一个功能,并且是默认行为。

基本上,为了节省内存,TabControl 卸载了其内容区域中的可视化树,并将其替换为用于新选项卡的新创建的可视化树。为了向自己证明这一点,您可以在您模板化的每个控件上监听 Unload 事件,并注意到它会在您每次切换选项卡时触发。

您想要覆盖此行为的原因可能有 2 个:

  1. 您认为这会严重影响性能。
  2. 您正在丢失控件的状态,因为正在丢失的任何视觉状态都不受 ViewModel 的支持。

至于#1,您不必担心。 CPU 时间通常比 RAM 便宜,默认行为倾向于资源等式中便宜的一面。如果你仍然觉得你真的不想要这种行为,你可以在这里看到一个覆盖它的例子: https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Wpf.Example/Controls/NonReloadingTabControl.cs

但是,我认为这是潜在的 future 性能问题的“预兆”,您现在应该花时间解决问题,而不是推迟解决问题。

对于#2,您有两个选择:

  1. 确保您想要保留的每个属性(如 IsSelected 等)都由保留该状态的 ViewModel 提供支持。
  2. 为您绑定(bind)到的每个选项卡创建一个持久的 UserControl,而不是绑定(bind)到 ViewModel(在您的例子中是工作区)。在 WAF 的“Writer”样本中有一个这样的例子:http://waf.codeplex.com/

关于wpf - TabControl 处理非事件选项卡上的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2238072/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com