【问题标题】:C# UWP Undo buttonC# UWP 撤消按钮
【发布时间】:2016-06-22 17:15:59
【问题描述】:

好的,所以我创建了一个应用来管理 2 个团队的分数。 APP Layout。正如你所看到的,我有 A 队和 B 队,下面的 0 增加了总分的分数,而在下面你有每轮获得的分数的历史记录。 当您按下 go 按钮时,来自 2 个文本框的点会为所有分数进行加法,并将该轮的分数添加到列表中。 如您所见,我创建了一个撤消按钮。因此,例如,如果我不小心按了“开始”按钮,我只需点击我的撤消按钮即可撤消按钮来撤消我的错误。问题是我不知道在撤销按钮的点击事件中写什么代码。

private void Undo_Click(object sender, RoutedEventArgs e)
    {

    }

注意:我的列表绑定到我创建的类。所以每个列表都会通过 observablecollection 显示它需要的属性。

class List
{
    public int ListA { get; set; }
    public int ListB { get; set; }
}

更新:

private void Undo_Click(object sender, RoutedEventArgs e)
    {
        var lastState = Lists.Last();
        int teamAScore, teamBScore, listA, listB;

        // this way i got the Active scores.
        int.TryParse(CurrentScoreA.Text, out teamAScore);
        int.TryParse(CurrentScoreB.Text, out teamBScore);

        // this way i got the last score that i want to remove.
        listA = lastState.ListA;
        listB = lastState.ListB;

        // here i remove the last score from the Active one.
        teamAScore = teamAScore - listA;
        teamBScore = teamBScore - listB;

        // And here i replace my Active score with 
        // the new one that has the last states removed.
        CurrentScoreA.Text = teamAScore.ToString();
        CurrentScoreB.Text = teamBScore.ToString();

        // this one removes the last states of the list
        // so this way i can always remove the last part of my lsit
        // from both my active score and list till i go back to 0.
        Lists.Remove(lastState);
    }

非常感谢下面回答我问题的 2 个人,通过阅读并尝试执行它们,我找到了我的解决方案!!!! :)

【问题讨论】:

  • 理论上,您只需在单击处理程序中添加一行,记录执行的操作(甚至执行的操作的运行队列)。单击撤消时,您只需反转存储的操作。
  • 撤消应该将所有项目返回到以前的状态...这可以通过两种方式完成(可能更多):1.保持列表的先前状态,将列表复制到临时列表并在进行任何更改之前将它们保存到其中……但这可能会占用大量资源。 2. 保留一个 las mod 变量,允许您在列表上应用相反的操作,例如包含所有可能更改的结构更改,并存储最后一个完成的操作。

标签: c# win-universal-app undo


【解决方案1】:

我的意思是:

class List
{
    public int ListA { get; set; }
    public int ListB { get; set; }
} 

然后你创建 2 个 List 类的对象,一个用于操作,另一个保持之前的状态(但它复制了你的对象!!!)

按钮将是:

private void Undo_Click(object sender, RoutedEventArgs e)
    {
        ClassListObj1.ListA = ClassListObj2.ListA;
        ClassListObj1.ListB = ClassListObj2.ListB;
    }

甚至,但我不确定......

private void Undo_Click(object sender, RoutedEventArgs e)
    {
        ClassListObj1 = ClassListObj2;
    }

请记住,您必须在修改列表之前执行ClassListObj2.ListA = ClassListObj1.ListA;ClassListObj2.ListB = ClassListObj1.ListB;

结构的想法更好,但它需要我更多地了解你的应用程序,才能详细说明。

【讨论】:

  • 我将如何创建这些 ClassListObj1 我有点困惑。那么我应该在 public int ListA{ get; 之前添加什么?放; ??因为我明白了,所以我对一个列表进行操作,而另一个列表有 1 步后退,之后要撤消,我只需将 List 中的项目更改为 ObjList 上的项目,它落后了 1 步,对吧?
  • List ClassListObj1 = new List(); 是您的类 List 的一个实例。问题:List不是保留字吗?您可能需要更改类的名称;)
  • 是的,我明白了你的想法,可能这个名字破坏了执行:P 但是通过阅读你的想法和其他答案,我发现了很多方法:) 我会发布我更新的代码。 @迭戈卡拉斯卡尔
【解决方案2】:

全景, 您可以创建一个List<List<List>>(对不起,您的班级名称没有帮助),每次用户添加分数时,您都会像状态一样将值保存在列表中。因此,当您单击撤消时,您会从列表列表中弹出最后一项并替换到您的列表中。这是一个例子

List<List<Score>> ScoreStates = new List<List<Score>>();
List<Score> Scores = new List<Score>();

private void Undo_Click(object sender, RoutedEventArgs e)
{
    var lastState = ScoreStates.Last();
    ScoreStates.Remove(lastState);
    Scores = lastState;
}

public class Score
{
    public int TeamA { get; set; }
    public int TeamB { get; set; }
}

【讨论】:

  • 好吧,用你的想法,我找到了怎么做,我会更新我的代码,这样大家就可以得到这个想法了 thnx :)
猜你喜欢
  • 2011-02-24
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 2020-04-19
相关资源
最近更新 更多