当前位置: 首页 > news >正文

Avalonia的事件示例

vs studio 2026创建Avalonia应用程序。

MainWindow.axmal文件如下:

<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:vm="using:TestAvaloniaMVVM.ViewModels"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"d:DesignWidth="400"d:DesignHeight="450" x:Class="TestAvaloniaMVVM.Views.MainWindow"x:DataType="vm:MainWindowViewModel"Icon="/Assets/avalonia-logo.ico"Title="GetStartedApp"><Design.DataContext><!-- This only sets the DataContext for the previewer in an IDE,to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) --><vm:MainWindowViewModel/></Design.DataContext> <Grid  Margin="10"><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="1*"/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="1*"/><RowDefinition Height="1*"/><RowDefinition Height="1*"/><RowDefinition Height="1*"/></Grid.RowDefinitions> <Border Background="LightPink" CornerRadius="10" Margin="2" Name="borderTunnelling"><Button HorizontalAlignment="Center" Name="btnTunnelling" >Tunnelling</Button></Border><Border Background="LightSalmon" CornerRadius="10" Margin="2" Grid.Row="1" Name="borderBubbling"><Button HorizontalAlignment="Center" Name="btnBubbling" >Bubbling</Button></Border> </Grid></Window>

MainWindow.axmal.cS文件如下:

using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;// 必须引用:包含 RoutingStrategies
using System.Diagnostics;
using System.Threading.Tasks;// 必须引用:包含 PointerPressedEventArgs
using Avalonia.VisualTree;// 必须引用这个namespace TestAvaloniaMVVM.Views
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();// 1. 注册 隧道事件 (Tunnelling)this.AddHandler(InputElement.PointerReleasedEvent,Border_Tunnelling_Handler,RoutingStrategies.Tunnel);// 2. 注册 冒泡事件 (Bubbling)this.AddHandler(InputElement.PointerReleasedEvent,Border_Bubbling_Handler,RoutingStrategies.Bubble,handledEventsToo: true); // <--- 即便 Button 把事件标为“已处理”,我也要强制捕获它;}#region  PointerReleasedEvent // 注意:这里的参数类型必须改为 PointerReleasedEventArgsprivate async void Border_Tunnelling_Handler(object? sender, PointerReleasedEventArgs e){// 从触发源(可能是 AccessText)向上找,看它是不是在名为 "btnTunnelling" 的按钮里var btn = e.Source as Control;// 向上寻找最近的 Button 类型的祖先var actualButton = btn.FindAncestorOfType<Button>(includeSelf: true);if (actualButton != null && actualButton.Name == "btnTunnelling"){var msgBox = new Window{Title = "隧道通知",Content = new TextBlock { Text = "隧道阶段触发了!", Margin = new Thickness(20) },Width = 300,Height = 150,WindowStartupLocation = WindowStartupLocation.CenterOwner};await msgBox.ShowDialog(this);}}// 注意:这里的参数类型必须改为 PointerReleasedEventArgsprivate async void Border_Bubbling_Handler(object? sender, PointerReleasedEventArgs e){// 从触发源(可能是 AccessText)向上找,看它是不是在名为 "btnBubbling" 的按钮里var btn = e.Source as Control;// 向上寻找最近的 Button 类型的祖先var actualButton = btn.FindAncestorOfType<Button>(includeSelf: true);if (actualButton != null && actualButton.Name == "btnBubbling"){var msgBox = new Window{Title = "冒泡通知",Content = new TextBlock { Text = "冒泡阶段触发了!", Margin = new Thickness(20) },Width = 300,Height = 150,WindowStartupLocation = WindowStartupLocation.CenterOwner};await msgBox.ShowDialog(this);}}#endregion#region PointerPressedEventArgs//// 隧道处理器(外层先触发)//private async void Border_Tunnelling_Handler(object? sender, PointerPressedEventArgs e)//{//    // 检查:我们只关心那个叫 borderTunnelling 的 Border 发生的事件//    if (e.Source is Control c && c.Name == "btnTunnelling")//    {//        string info = ">>> [隧道阶段] Border 拦截到了按钮点击!按钮还没反应,我就先知道了。";//        var msgBox = new Window//        {//            Title = "事件通知",//            Content = new TextBlock { Text = info, Margin = new Thickness(20) },//            Width = 300,//            Height = 150,//            WindowStartupLocation = WindowStartupLocation.CenterScreen//        };//        await msgBox.ShowDialog(this);//        // 如果你想在这里“拦截”掉事件,不让按钮触发://        // e.Handled = true; //    }//}//// 冒泡处理器(内部先触发,外部后触发)//private async void Border_Bubbling_Handler(object? sender, PointerPressedEventArgs e)//{//    if (e.Source is Control c && c.Name == "btnBubbling")//    {//        string info = "<<< [冒泡阶段] 按钮可能已经点过了,现在信号传到了外层 Border。";//        var messageBox = new Window//        {//            Title = "事件通知",//            Content = new TextBlock { Text = info, Margin = new Thickness(20) },//            Width = 300,//            Height = 150,//            WindowStartupLocation = WindowStartupLocation.CenterOwner//        };//        await messageBox.ShowDialog(this);//    }//}#endregion}
}

启动程序,点击“Tunneling”按钮效果图:

image

启动程序,点击“Bubbling”按钮效果图:

image

http://www.jsqmd.com/news/415409/

相关文章:

  • 流水线夸一夸gemini
  • CF2192E Swap to Rearrange 题解
  • woloveai
  • python: Observer Pattern
  • LangChain、FastAPI、Python大型语言模型LLM电商多智能体Multi-Agent客服系统|附代码
  • 想要 B 站视频做剪辑素材?高清无码下载是第一步
  • 本本书屋:为程序员量身打造的技术知识架构与资源导航平台
  • 本本书屋:构建程序员专属的智能化知识工程平台
  • 使用react-pdf 实现pdf预览功能
  • 如何下载 B 站 60 帧高清视频?这一个网址就够了
  • 2026年太原GEO优化公司推荐Top8:从技术实力到效果落地的深度测评 - 小白条111
  • 哲学之星:发刊词——一个开放的思想驿站
  • 2026年哈尔滨GEO优化公司推荐Top6:深度测评与选型指南 - 小白条111
  • 2026年合肥GEO优化公司TOP5深度测评:从技术实力到效果落地的选型指南 - 小白条111
  • 2026年武汉GEO优化公司推荐TOP8:从技术实力到效果落地的深度测评 - 小白条111
  • 集训图论专题
  • 2026年2月灰色花岗岩火烧板供货商推荐,低调耐看工程通用款 - 品牌鉴赏师
  • DOLLAR GENERAL SBT 模式下的 EDI 实施挑战与系统解决方案
  • 绿色化工2026年2月钛酸正/正钛酸四/钛酸四正丁酯正钛酸/钛酸四丁酯厂家三维测评:亲测十大案例,直击行业痛点,这份口碑选型,您值得拥有! - 品牌推荐用户报道者
  • 优秀的设计
  • 2026年GEO源码搭建哪家好? - 源码云科技
  • 适配子血清稳定性:DNA 适配子优势与化学改良策略
  • MAUI库推荐四:Maui.ContentButton
  • 2026年沈阳GEO优化公司推荐Top4:从技术实力到效果落地的专业测评榜单 - 小白条111
  • 解题报告-P11674 [USACO25JAN] Reachable Pairs G
  • P10716 简单的字符串问题 个人题解
  • 2026嘉兴靠谱财税公司推荐|本土深耕11载,汇辉财税凭口碑赢信任 - 品牌智鉴榜
  • 医生/律师如何搭建自己的知识付费平台?开发技术方案解析
  • 实习综合服务计算机毕业设计springboot高校学生平台 基于SpringBoot的高校学生实习管理与就业对接平台 智慧校园环境下的大学生实习实践数字化服务平台
  • 靠谱GEO优化源码搭建工具推荐|源码云GEO优化系统带国家软著,GEO优化排名软件贴牌代理,创业必选项目 - 源码云科技