2016-03-21 46 views
0

我跟隨Stephen關於異步UI的this great article,但不幸的是這不適用於通用Windows應用程序,因爲CommandManager類不可用。UWA上的異步UI模式

我該如何解決這個限制?

這是異步命令的基本類型:

public abstract class AsyncCommandBase : IAsyncCommand 
{ 
    public abstract bool CanExecute(object parameter); 
    public abstract Task ExecuteAsync(object parameter); 
    public async void Execute(object parameter) 
    { 
    await ExecuteAsync(parameter); 
    } 
    public event EventHandler CanExecuteChanged 
{ 
add { CommandManager.RequerySuggested += value; } 
remove { CommandManager.RequerySuggested -= value; } 
} 
    protected void RaiseCanExecuteChanged() 
{ 
CommandManager.InvalidateRequerySuggested(); 
} 
} 
+0

無論如何,使用CommandManager的這種「模式」非常糟糕,並且在複雜應用程序中有許多命令時會嚴重影響性能,因爲它會強制** ALL **命令重新評估它們的「CanExecute」方法 – Tseng

回答

1

正如在評論中指出,不應該用這種「模式」,因爲它是對性能的影響,當你有很多註冊的命令。

CommandManager.InvalidateRequerySuggested()的任何調用都將強制WPF驗證每個註冊的命令,它的方法是CanExecute(...)

相反,只是聲明該事件並只讓每當你想你失效仍然只使用command.RaiseCanExecuteChanged();命令WPF註冊它

public abstract class AsyncCommandBase : IAsyncCommand 
{ 
    ... 
    public event EventHandler CanExecuteChanged; 
    public void RaiseCanExecuteChanged() 
    { 
     // C# 6.0, otherwise assign the handler to variable and do null check 
     CanExecuteChanged?.Invoke(this, EventArgs.Empty); 
    } 
    ... 
} 

。如果你想觸發多個命令的重新驗證,你需要自己管理它(即創建一個CompoundCommand或類似的地方,你的命令註冊到組)。