Tag: WPF Undo

目次

参考情報

WPF Undo/Redo Frameworkに関して

  • サンプルはソースコードのダウンロードから入手可能(ダウンロードはDLLのみ)。
  • UndoableActionBaseを継承したUndoablePropertyとDelegateUndoableCommandを使う。
  • MVVM風にViewModelのプロパティの変更をUndoしたい場合は、次のようにUndoablePropertyを使ってプロパティ定義する。
            private UndoableProperty<double> _sliderText;
            public double SliderText
            {
                get { return _sliderText.GetValue(); }
                set { _sliderText.SetValue(value); }
            }
    
  • プロパティの変更はPropertyChangedで通知されるが、Undoは以下の処理によりある程度の時間以内の変更は1つの処理として元に戻される。
            /// <summary>
            /// Tells the context that an action has occurred.
            /// </summary>
            /// <param name="action">The action that was executed.</param>
            /// <param name="data">The data associated with the action.</param>
            public void ActionExecuted(IUndoableAction action, object data)
            {
    			object possible = null;
    
                if (action is IUndoableProperty && (this.UndoStack.Count > 0 && this.UndoStack.First().Item1 == action.Name))
                {
                    if ((DateTime.Now - lastModified).TotalMilliseconds < (action as IUndoableProperty).BatchingTimeout)
                    {
                        possible = this.UndoStack.Pop().Item2;
                    }
                    else
                    {
                        this.lastModified = DateTime.Now;
                    }
                }
                else
                {
                    this.lastModified = DateTime.Now;
                }
    		
    			if (possible == null)
    			{
    				this.UndoStack.Push(new Tuple<string, object>(action.Name, data));
    			}
    			else
    			{
    				this.UndoStack.Push(new Tuple<string, object>(action.Name, possible));
    			}
    
                this.RedoStack.Clear();
               
            }
    
    
    
  • プロパティ以外のコマンドをUndoしたい場合次のようにする。サンプルのボタンがおされたときの処理。
            public UndoableDelegateCommand<string, char> TypeCharacterCommand { get; set; }
    
            public char TypeCharacterCommand_Execute(string s)
            {
                var c = s.First();
                this.SomeText += c;
                return c;
            }
    
            public bool TypeCharacterCommand_CanExecute(string s)
            {
                if (string.IsNullOrEmpty(s))
                {
                    return false;
                }
    
                var c = s.First();
                if (char.IsDigit(c))
                {
                    return true;
                }
    
                return false;
            }
    
    

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-13 (水) 16:47:43 (1072d)