UI 在命令调用之前控制可见性?
UI Control Visibility Before Command Invocation?
我有一个发送多封电子邮件的按钮命令,因此需要几秒钟的时间来执行该方法。我想在执行此方法时显示进度环 Mahapps.Metro
并禁用视图。
这是我的 ProgressRing
在我看来:
<Controls:ProgressRing IsActive="True" Visibility="{Binding IsProgressRingVisible, UpdateSourceTrigger=PropertyChanged}" />
ViewModel
属性:
private Visibility _IsProgressRingVisible;
public Visibility IsProgressRingVisible
{
get { return _IsProgressRingVisible; }
set
{
_IsProgressRingVisible = value;
OnPropertyChanged("IsProgressRingVisible");
}
}
& 最后我的按钮命令逻辑:
private void DisableView()
{
IsProgressRingVisible = Visibility.Visible;
IsEditable = false;
}
private void ApprovePublicationCommandAction()
{
DisableView();
try
{
Send emails blah bah
显然,命令方法逻辑在通知 UI 并更改 ProgressRing
可见性之前运行。有什么方法可以显示 ProgressRing
然后继续执行命令逻辑?
你可以创建一个像 CommandIsExecuting 这样的 属性 并且你可以将这个 属性 绑定到命令的 whenExecuting Action。
下面是 AsyncRelayCommand 构造器的代码片段
readonly Func<T, Task> _asyncExecute;
readonly Predicate<T> _canExecute;
readonly Action<bool> _whenExecuting;
public AsyncRelayCommand(Func<T, Task> asyncExecute, Predicate<T> canExecute, Action<bool> whenExecuting)
{
if (asyncExecute == null)
throw new ArgumentNullException("asyncExecute");
_asyncExecute = asyncExecute;
_canExecute = canExecute;
_whenExecuting = whenExecuting;
}
然后在执行命令的 ViewModel 中,您只需使用 whenExecuting 到本地 属性,如下所示
private bool _commandIsExecuting;
public virtual bool CommandIsExecuting
{
get
{ return _commandIsExecuting; }
protected set
{
_commandIsExecuting = value;
OnPropertyChanged(() => this.CommandIsExecuting);
}
}
MyCommand = new AsyncRelayCommand<object>(CommandImplementation, CanIExecute, (b) => CommandIsExecuting = b);
完成了我的方法 Async
:
private async void ApprovePublicationCommandAction()
{
DisableView();
await Task.Factory.StartNew(() =>
{
try
{
Send emails blah blah
然后在工作完成后启用视图,前提是不抛出异常。感谢您的帮助。
我有一个发送多封电子邮件的按钮命令,因此需要几秒钟的时间来执行该方法。我想在执行此方法时显示进度环 Mahapps.Metro
并禁用视图。
这是我的 ProgressRing
在我看来:
<Controls:ProgressRing IsActive="True" Visibility="{Binding IsProgressRingVisible, UpdateSourceTrigger=PropertyChanged}" />
ViewModel
属性:
private Visibility _IsProgressRingVisible;
public Visibility IsProgressRingVisible
{
get { return _IsProgressRingVisible; }
set
{
_IsProgressRingVisible = value;
OnPropertyChanged("IsProgressRingVisible");
}
}
& 最后我的按钮命令逻辑:
private void DisableView()
{
IsProgressRingVisible = Visibility.Visible;
IsEditable = false;
}
private void ApprovePublicationCommandAction()
{
DisableView();
try
{
Send emails blah bah
显然,命令方法逻辑在通知 UI 并更改 ProgressRing
可见性之前运行。有什么方法可以显示 ProgressRing
然后继续执行命令逻辑?
你可以创建一个像 CommandIsExecuting 这样的 属性 并且你可以将这个 属性 绑定到命令的 whenExecuting Action。
下面是 AsyncRelayCommand 构造器的代码片段
readonly Func<T, Task> _asyncExecute;
readonly Predicate<T> _canExecute;
readonly Action<bool> _whenExecuting;
public AsyncRelayCommand(Func<T, Task> asyncExecute, Predicate<T> canExecute, Action<bool> whenExecuting)
{
if (asyncExecute == null)
throw new ArgumentNullException("asyncExecute");
_asyncExecute = asyncExecute;
_canExecute = canExecute;
_whenExecuting = whenExecuting;
}
然后在执行命令的 ViewModel 中,您只需使用 whenExecuting 到本地 属性,如下所示
private bool _commandIsExecuting;
public virtual bool CommandIsExecuting
{
get
{ return _commandIsExecuting; }
protected set
{
_commandIsExecuting = value;
OnPropertyChanged(() => this.CommandIsExecuting);
}
}
MyCommand = new AsyncRelayCommand<object>(CommandImplementation, CanIExecute, (b) => CommandIsExecuting = b);
完成了我的方法 Async
:
private async void ApprovePublicationCommandAction()
{
DisableView();
await Task.Factory.StartNew(() =>
{
try
{
Send emails blah blah
然后在工作完成后启用视图,前提是不抛出异常。感谢您的帮助。