选定的选项卡会随着外部 TabControl 内的模板化 WPF TabControl 的变化而变化

发布于 2024-11-16 10:43:30 字数 2417 浏览 1 评论 0原文

我有一个带有外部 TabControl 的 WPF UI,其 TabItems 包含内部 TabControl,如下所示:

<TabControl>
    <TabItem Header="Tab1">
        <TabControl>
            <TabItem Header="TabA">
            </TabItem>
            <TabItem Header="TabB">
            </TabItem>
        </TabControl>
    </TabItem>
    <TabItem Header="Tab2">
        <TabControl>
            <TabItem Header="TabC">
            </TabItem>
            <TabItem Header="TabD">
            </TabItem>
        </TabControl>
    </TabItem>
</TabControl>

当在外部 TabControl 上从 Tab1 切换到 Tab2 时,内部 TabControl 会记住它们的选择。示例:选择 Tab1,选择 TabB,选择 Tab2,选择 Tab1,您会发现 TabB 仍处于选中状态。

当我更改 TabControl 模板时,这种一致性就会崩溃。事实上,当您从外部 TabControl 上的 Tab1 移动到 Tab2 时,内部 TabControl 上选定的选项卡似乎会随机更改。以下是一些示例模板:

<Window.Resources>
    <ControlTemplate x:Key="TabControlTemplate1" TargetType="{x:Type TabControl}">
        <DockPanel>
            <StackPanel Orientation="Vertical" DockPanel.Dock="Left" IsItemsHost="True"/>
            <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
        </DockPanel>
    </ControlTemplate>
    <ControlTemplate x:Key="TabControlTemplate2" TargetType="{x:Type TabControl}">
        <DockPanel>
            <UniformGrid Rows="1" DockPanel.Dock="Top" IsItemsHost="True"/>
            <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
        </DockPanel>
    </ControlTemplate>
</Window.Resources>
<TabControl Template="{DynamicResource TabControlTemplate1}">
    <TabItem Header="Tab1">
        <TabControl Template="{DynamicResource TabControlTemplate2}">
            <TabItem Header="TabA">
            </TabItem>
            <TabItem Header="TabB">
            </TabItem>
        </TabControl>
    </TabItem>
    <TabItem Header="Tab2">
        <TabControl Template="{DynamicResource TabControlTemplate2}">
            <TabItem Header="TabC">
            </TabItem>
            <TabItem Header="TabD">
            </TabItem>
        </TabControl>
    </TabItem>
</TabControl>

如何对外部和内部选项卡控件进行模板化并维护内部选项卡控件上的选定选项卡状态?

I have a WPF UI with an outer TabControl whose TabItems contain inner TabControls like this:

<TabControl>
    <TabItem Header="Tab1">
        <TabControl>
            <TabItem Header="TabA">
            </TabItem>
            <TabItem Header="TabB">
            </TabItem>
        </TabControl>
    </TabItem>
    <TabItem Header="Tab2">
        <TabControl>
            <TabItem Header="TabC">
            </TabItem>
            <TabItem Header="TabD">
            </TabItem>
        </TabControl>
    </TabItem>
</TabControl>

When switching from Tab1 to Tab2 on the outer TabControl, the inner TabControls remember their selection. Example: Select Tab1, select TabB, select Tab2, select Tab1 and you'll find TabB still selected.

This consistency falls apart when I change the TabControl templates. In fact, the selected tab on the inner TabControls appears to randomly change when you move from Tab1 to Tab2 on the outer TabControl. Here are some sample templates:

<Window.Resources>
    <ControlTemplate x:Key="TabControlTemplate1" TargetType="{x:Type TabControl}">
        <DockPanel>
            <StackPanel Orientation="Vertical" DockPanel.Dock="Left" IsItemsHost="True"/>
            <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
        </DockPanel>
    </ControlTemplate>
    <ControlTemplate x:Key="TabControlTemplate2" TargetType="{x:Type TabControl}">
        <DockPanel>
            <UniformGrid Rows="1" DockPanel.Dock="Top" IsItemsHost="True"/>
            <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
        </DockPanel>
    </ControlTemplate>
</Window.Resources>
<TabControl Template="{DynamicResource TabControlTemplate1}">
    <TabItem Header="Tab1">
        <TabControl Template="{DynamicResource TabControlTemplate2}">
            <TabItem Header="TabA">
            </TabItem>
            <TabItem Header="TabB">
            </TabItem>
        </TabControl>
    </TabItem>
    <TabItem Header="Tab2">
        <TabControl Template="{DynamicResource TabControlTemplate2}">
            <TabItem Header="TabC">
            </TabItem>
            <TabItem Header="TabD">
            </TabItem>
        </TabControl>
    </TabItem>
</TabControl>

How can I template the outer and inner tab controls and maintain the selected tab state on the inner tab controls?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情仇皆在手 2024-11-23 10:43:30

您是否尝试过通过 ViewModel 控制选项卡选择?如果您使用 ViewModel 模式,那么将 SelectedItem 属性绑定到底层属性以在选择更改时更新它并不是太困难。

我之前在 ListViews 上使用过这个,我在运行时更改了 ItemTemplates 以保护所选项目。我不明白为什么它在这种情况下也不起作用。

Have you tried controlling tab selection through a ViewModel? If you are using the ViewModel pattern, it would not be too terribly hard to bind the SelectedItem attribute to an underliying property to update it when the selection changes.

I have used this before on ListViews where I changed ItemTemplates at run time to secure the selected Item. I dont see why it would not work in this instance too.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文