在 Avalonia 项目中,某些控件比如 Border 是没有 Command 命令的。如果想要 Border 被点击时触发 ViewModel 中的 Command,则必须做一些额外的工作。
和 WPF 不同,在 Avalonia 中鼠标点击元素触发的事件名为:PointerPressed
。我们要做的是:在 PointerPressed
事件被触发后调用 ViewModel 中的 Command。
Avalonia XAML Behaviors is an easy-to-use means of adding common and reusable interactivity to your Avalonia applications with minimal code. Avalonia port is available only for managed applications. Use of XAML Behaviors is governed by the MIT License.
Avalonia.Xaml.Behaviors
先在项目中增加对 Avalonia.Xaml.Behaviors
的 NuGet 引用,接着在页面上引入名称空间:
<UserControl ... xmlns:ic="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity" xmlns:ia="clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions" > ... </UserControl>
以下代码假设 ViewModel 中有一个名为 TestCommand 的命令:
<Border Background="Transparent"> <ic:Interaction.Behaviors> <ia:EventTriggerBehavior EventName="PointerPressed"> <ia:InvokeCommandAction Command="{Binding TestCommand}"></ia:InvokeCommandAction> </ia:EventTriggerBehavior> </ic:Interaction.Behaviors> ... </Border>
Border 的 Background 属性必须要有值,即便是设置为透明也是有意义的。否则可能会出现鼠标点击没有效果的情况。
提示
本文给出的解决方案是我从 WPF 项目里继承下来的。因为目前对 Avalonia 的熟悉程度还不够,所以不确定在 Avalonia 的世界中是否有更好的方案,故本文仅供参考。请根据实际情况探索和尝试其他可能的解决方案,以便更好地满足项目的需求。
完整的代码可以看这里:
https://gitee.com/coderbusy/demo/tree/master/avaloina/BorderClickCommand