1

TabControl在. TextBox_ ContentTemplate当我在一个选项卡中键入一些文本并切换到另一个选项卡时,当我返回时,原始选项卡中的撤消历史记录消失了。

出现的另一个问题是任何被选择的文本都被取消选择,并且插入符号移动到TextBox.

如果我只使用硬编码控件创建一个窗口,TabItem则会保留撤消历史记录。这个问题与我的绑定或模板有关。

这是我的主窗口的 XAML

<Window x:Class="TabbedTextAreaTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Button Command="{Binding AddNewTab}">Add Tab</Button>
        <TabControl ItemsSource="{Binding Tabs}" Grid.Row="1">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Header}"/>
                </DataTemplate>
            </TabControl.ItemTemplate>
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Content, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
</Window>

有没有办法在切换选项卡时保留撤消/重做历史和选定的文本而无需手动捕获这些命令?

4

2 回答 2

2

当您使用TabControl通过数据绑定获取其选项卡的 a 时ItemsSource,WPF 不会在您切换时保留每个项目的可视化树。因此,当您从选项卡 1 切换到选项卡 2,然后再切换回选项卡 1 时,选项卡 1 上的控件实际上与您第一次在选项卡 1 上看到的控件实例不同。

有很多方法可以解决这个问题 -当您切换选项卡时TabControl,具有显式TabItem实例的 s 会保留其可视化树,因此最简单的方法可能是将您的选项卡项目集合包装在TabItem为它们制作 s 的东西中.

不幸的是,现在我找不到指向如何执行此操作的示例的链接。SO上有其他地方的文章参考,但它们似乎都指向不再存在的页面,我没有时间深入挖掘。

于 2012-06-14T15:37:14.887 回答
1

原因很简单。如果你认为你抱怨的两个操作都是严格的 UI 操作:撤消:用户在UI 控件上编辑,选择:选择UI 控件上的文本。

当您切换Tab到另一个并返回时,WPF 中发生的情况是所有控件都重新绑定到那里的数据(ModelView通常或只是Model),就好像您第一次显示它们一样。所以他们失去了他们的 UI 外观属性。

Tab要在环境中正确管理它,WPF您需要自己管理Undo/Redo堆栈。

祝你好运。

于 2012-06-14T15:33:16.107 回答