gpt4 book ai didi

c# - 在 WPF 中使用 ICommand

转载 作者:行者123 更新时间:2023-12-03 20:17:30 25 4
gpt4 key购买 nike

在 WPF 中使用命令的最佳方式是什么?

我使用了一些命令,这些命令可能需要一些时间才能执行。我希望我的应用程序在运行时不会卡住,但我希望禁用这些功能。

这是我的 MainWindow.xaml :

<Window ...>
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Button Grid.Row="0"
Grid.Column="0"
Style="{StaticResource StyleButton}"
Content="Load"
Command="{Binding LoadCommand}"/>
<Button Grid.Row="0"
Grid.Column="1"
Style="{StaticResource StyleButton}"
Content="Generate"
Command="{Binding GenerateCommand}"/>
</Grid>
</Window>

和我的 MainViewModel.cs:

public class MainViewModel : ViewModelBase
{

#region GenerateCommand
#endregion

#region Load command
private ICommand _loadCommand;
public ICommand LoadCommand
{
get
{
if (_loadCommand == null)
_loadCommand = new RelayCommand(OnLoad, CanLoad);
return _loadCommand;
}
}

private void OnLoad()
{
//My code
}
private bool CanLoad()
{
return true;
}
#endregion
}

我看到了后台 worker 的解决方案,但我不知道如何使用它。我想知道我是否应该通过命令创建一个实例。

有更清洁/最好的方法吗?

最佳答案

I want that my application not freeze while running but I want the features to be disabled.

防止应用程序卡住的关键是在后台线程上执行任何长时间运行的操作。最简单的方法是启动一个任务。要禁用该窗口,您可以将其 IsEnabled 属性绑定(bind)到您在开始任务之前设置的 View 模型的源属性。以下示例代码应该可以让您了解:

public class MainViewModel : ViewModelBase
{
private RelayCommand _loadCommand;
public ICommand LoadCommand
{
get
{
if (_loadCommand == null)
_loadCommand = new RelayCommand(OnLoad, CanLoad);
return _loadCommand;
}
}

private void OnLoad()
{
IsEnabled = false;
_canLoad = false;
_loadCommand.RaiseCanExecuteChanged();

Task.Factory.StartNew(()=> { System.Threading.Thread.Sleep(5000); }) //simulate som long-running operation that runs on a background thread...
.ContinueWith(task =>
{
//reset the properties back on the UI thread once the task has finished
IsEnabled = true;
_canLoad = true;
}, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
}

private bool _canLoad = true;
private bool CanLoad()
{
return _canLoad;
}

private bool _isEnabled;
public bool IsEnabled
{
get { return _isEnabled; }
set { _isEnabled = value; RaisePropertyChanged(); }
}
}

请注意,您不能从后台线程访问任何 UI 元素,因为控件具有线程关联性:http://volatileread.com/Thread/Index?id=1056

关于c# - 在 WPF 中使用 ICommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41849225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com