Avalonia Calendar 日历控件遇到 Flyout 或者切换页面时出现的鼠标按下失效的解决方法
省流:把事件订阅从 DataContextChanged 改为路由事件订阅
一、背景
出现的问题:当点击了日期后,第二次打开,鼠标偶尔仍然处于按下的状态擅自选择了一个日期并执行了事件。
这是一个点击按钮展开日历的一个控件,我们的 Xaml 和 Code-Behind C# 是这样写的:
<Buttonx:Name="PART_Button"Width="100"Height="100"><Button.Flyout><Flyout><Calendar DataContextChanged="Calendar_DataContextChanged" /></Flyout></Button.Flyout></Button>
private void Calendar_SelectedDatesChanged_1(object? sender, Avalonia.Controls.SelectionChangedEventArgs e){PART_Button.Flyout.Hide();}
二、解决方法
把事件订阅从 DataContextChanged 改为 路由事件订阅按钮
<Buttonx:Name="PART_Button"Width="100"Height="100"><Button.Flyout><Flyout><Calendar Button.Click="Calender_ButtonClick" /></Flyout></Button.Flyout></Button>
private void Calender_ButtonClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e){if (e.Source is not CalendarDayButton) return;PART_Button.Flyout.Hide();}
三、如果路由事件写不上怎么办?
你可以在 Code-Behind C# 的代码部分随着控件初始化的时候附加,就像这样:
<Buttonx:Name="PART_Button"Width="100"Height="100"><Button.Flyout><Flyout><Calendar x:Name="PART_Calendar" /></Flyout></Button.Flyout></Button>
C# 的部分请这样做。
protected override void OnLoaded(RoutedEventArgs e){base.OnLoaded(e);PART_Calendar.RemoveHandler(Button.ClickEvent, Calender_ButtonClick); // 避免多个重复事件订阅导致触发多次PART_Calendar.AddHandler(Button.ClickEvent, Calender_ButtonClick);}private void Calender_ButtonClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e){if (e.Source is not CalendarDayButton) return;PART_Button.Flyout.Hide();}