使用PostSharp进行嵌套的撤消/重做操作

时间:2015-05-01 06:55:00

标签: c# postsharp

我刚刚开始使用PostSharp,目前用于提供的撤销/重做功能,但未来可能还有很多功能。

我想知道是否有任何方法可以在我们的应用程序中实现嵌套的操作集。

所以我在主应用程序中有我的对象模型,然后我启动一个编辑器窗口来修改消息列表。我可以正确地使用PostSharp监视我对每条消息所做的所有个别更改,并允许用户撤消这些更改。到目前为止一切都很好。

我当时想要的是允许用户退出编辑器,现在在Undo堆栈上只有一个操作 - “撤消消息更改”或类似的东西。这将涉及在编辑被解雇时进行所有单独的更改并将它们合并到单个操作中。 我目前正在调查OperationScope方法,但我不确定我是否朝着正确的方向前进。在范围内,操作不会立即添加到撤消堆栈中,只有在关闭范围时才会添加它们,这不是我想要的。

我已经包含了一个非常简洁的测试代码示例和一些关于我在不同点上的期望的评论。可能是我想要的是不可能的,但希望有人会有一些建议!

    private void btnShowEditor_Click(object sender, EventArgs e)
    {
        // Nothing on the undo stack at this point
        LaunchEditorWindow();

        // I would like one composite operation at this point that can undo all of the changes made within LaunchEditorWindow
    }

    // Imagine this code is inside an editor window and the changes are being done by the user
    private void LaunchEditorWindow()
    {
        _network.Messages.Add(new Message() { Name = "Message 1", BitLength = 1 });

        // I would expect there to be three undo operations available here
        System.Diagnostics.Debug.WriteLine(RecordingServices.DefaultRecorder.UndoOperations.Count);

        _network.Messages.Add(new Message() { Name = "Message 2", BitLength = 2 });

        // 6 operations now
        _network.Messages.Add(new Message() { Name = "Message 3", BitLength = 3 });

        // etc etc
        _network.Messages.Add(new Message() { Name = "Message 4", BitLength = 4 });

        System.Diagnostics.Debug.WriteLine(RecordingServices.DefaultRecorder.UndoOperations.Count);
    }

0 个答案:

没有答案