结合RichEditBox和TextBox的撤销层次结构。

问题描述 投票:0回答:1

我有一个 RichEditBox 和a TextBox. 我想实现的是 "结合 "两个控件的撤销历史,就像它们是一个文本框一样。当用户在两个元素中的一个元素中执行撤消操作时,实际上应该发生在最近要撤消的事件的控件中。

例如,当我在文本框A中输入一些文本,然后在文本框B中输入一些文本,然后在两个元素中的一个元素中执行撤消操作,我希望B中的输入被删除。

我想过用 TextChanged 事件来建立我自己的撤消队列,但我没有看到像在这里一样对输入的字符进行分组的可能性。RichEditBox. 一个字符一个字符的撤销,在我看来,用户体验并不理想。

有谁知道这个问题的简单解决方案或变通方法吗?

c# uwp undo-redo
1个回答
0
投票

基于 文件 的,它提到RichEditBox的内容是一个 Windows.UI.Text.ITextDocument 对象,而这个ITextDocument接口提供了撤销和重做修改等方法。所以,如果要删除RichEditBox中的文本,当在TextBox中执行撤销操作时,可以使用ITextDocument接口来调用Undo方法。例如,我订阅了 预览键下 TextBox的事件,当按Back键在TextBox中执行撤销操作时,先删除RichEditBox中的文本或删除TextBox中的文本。

.xaml:

<StackPanel>
    <RichEditBox x:Name="MyRichBox"></RichEditBox>
    <TextBox x:Name="MyTextBox" PreviewKeyDown="MyTextBox_PreviewKeyDown"></TextBox>
</StackPanel>

.cs:

private void MyTextBox_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
    if (e.Key == Windows.System.VirtualKey.Back) 
    {
        //delete
        if (MyTextBox.Text == "") 
        {
            MyRichBox.Document.Undo();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.