目录

在 Maui 中自绘组件3:事件与命令

在这篇文章中,将为 MagicButton 定义 Clicked 事件及 Command,并调用事件和命令来增加计数值。

先决条件

事件

定义事件

GraphicsView 中,定义了 EndInteraction 事件,当 GraphicsView 被按下并放开之后触发。要在 MagicButton 中实现点击,只需要在 MagicButton 中定义 Clicked 事件,并在 EndInteraction 事件处理程序中触发 Clicked 即可。

编辑 MagicButton,定义 Clicked 事件:

public event EventHandler Clicked;

定义 OnEndInteraction 方法来订阅 EndInteraction 事件,并在方法中触发 Clicked 事件:

public MagicButton() {
    Drawable = new MagicButtonDrawable();

    EndInteraction += OnEndInteraction;
}

private void OnEndInteraction(object sender, TouchEventArgs e) {
    Clicked?.Invoke(sender, e);
}

订阅事件

修改 MainPage.xaml 中的 MagicButton,设置 Clicked 事件处理程序:

<components:MagicButton
    省略了其他属性设置......
    x:Name="MagicButton"
    Text="Click me"
    Clicked="MagicButton_OnClicked"></components:MagicButton>

修改 MainPage.xaml.cs,在 MagicButton_OnClicked 方法中处理点击事件:

private int _magicButtonCount = 0;
private void MagicButton_OnClicked(object sender, EventArgs e)
{
    _magicButtonCount++;

    MagicButton.Text = _magicButtonCount == 1 ?
        $"Clicked {_magicButtonCount} time" :
        $"Clicked {_magicButtonCount} times";
}

运行并点击 MagicButton,效果如下:

./event.gif
Using Event

命令

定义命令

MagicButton 中定义 ICommand 类型的可绑定属性,命名为 Command;定义 object 类型的命令参数可绑定属性,命名为 CommandParameter:

public static BindableProperty CommandProperty = BindableProperty.Create(
    nameof(Command),
    typeof(ICommand),
    typeof(MagicButton));

public ICommand Command {
    get => (ICommand)GetValue(CommandProperty);
    set => SetValue(CommandProperty, value);
}

public static BindableProperty CommandParameterProperty = BindableProperty.Create(
    nameof(CommandParameter),
    typeof(object),
    typeof(MagicButton));

public object CommandParameter {
    get => GetValue(CommandParameterProperty);
    set => SetValue(CommandParameterProperty, value);
}

修改 OnEndInteraction 方法,执行 Command 命令:

private void OnEndInteraction(object sender, TouchEventArgs e) {
    Clicked?.Invoke(sender, e);
    Command?.Execute(CommandParameter);
}

使用 ViewModel

在项目根目录下,创建 ViewModels 文件夹,并在其中创建 MainViewModel。在 MainViewModel 中定义 ClickedCount 属性用于 MagicButton 文本显示计数值,定义 Command 来增加 ClickedCount 计数值:

public class MainViewModel : INotifyPropertyChanged {

    private int _clickedCount;
    public int ClickedCount {
        set => SetField(ref _clickedCount, value, nameof(ClickedCount));
        get => _clickedCount;
    }

    public ICommand Command { get; set; }

    public MainViewModel() {
        Command = new Command(() => {
            ClickedCount++;
        });
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) {
        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }
}

更改 MainPage.xaml.cs 在构造函数中将 BindingContext 设为 MainViewModel 的实例:

public MainPage() {
    InitializeComponent();

    BindingContext = new MainViewModel();
}

更改 MainPage.xaml 中的 MagicButton,删除 Clicked 事件,并绑定 TextCommand

<components:MagicButton
    省略了其他属性设置......
    x:Name="MagicButton"
    x:DataType="viewModels:MainViewModel"
    Text="{Binding ClickedCount}"
    Command="{Binding Command}"></components:MagicButton>

运行并点击按钮,效果如下:

./command.gif
Using Command

推荐内容

源码获取

扫描下方二维码,关注公众号捕获异常,回复 maui 获取源码。

关注微信公众号“捕获异常”,获取最新文章推送,提升你的技能。

捕获异常微信公众号二维码