一、目的:应用MarkupExtention定义ICommand,使得应用起来更简单和高效
二、实现
public abstract class MarkupCommandBase : MarkupExtension, ICommand
{
public virtual bool CanExecute(object parameter)
{
return true;
}
public abstract void Execute(object parameter);
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
三、环境
VS2022
四、示例
自定义一个应用Process.Start路径的Command
public class ProcessCommand : MarkupCommandBase
{
public string Uri { get; set; }
public override bool CanExecute(object parameter)
{
string uri = parameter?.ToString() ?? this.Uri;
if (string.IsNullOrEmpty(uri))
return false;
bool result = File.Exists(uri) || Directory.Exists(uri);
if (parameter.ToString().ToUpper().StartsWith("http") == true)
return true;
return result;
}
public override void Execute(object parameter)
{
string uri = parameter?.ToString() ?? this.Uri;
Process.Start(new ProcessStartInfo(uri) { UseShellExecute = true });
}
}
定义一个按钮调用该命令
<Button Content="打开D盘"
Style="{DynamicResource {x:Static h:ButtonKeys.Default}}"
Command="{h:ProcessCommand}" CommandParameter="D:\"/>
输出结果
点击按钮后显示D盘资源管理器
五、需要了解的知识点
ICommand 接口 (System.Windows.Input) | Microsoft Learn
MarkupExtension 类 (System.Windows.Markup) | Microsoft Learn
六、源码地址
GitHub - HeBianGu/WPF-ControlDemo: 示例
GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库
GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库