找回密码
 立即注册
首页 业界区 安全 Avalonia Calendar 日历控件遇到 Flyout 或者切换页面时 ...

Avalonia Calendar 日历控件遇到 Flyout 或者切换页面时出现的鼠标按下失效的解决方法

轩辕娅童 2025-10-1 16:17:53
Avalonia Calendar 日历控件遇到 Flyout 或者切换页面时出现的鼠标按下失效的解决方法

省流:把事件订阅从 DataContextChanged 改为路由事件订阅
一、背景

出现的问题:当点击了日期后,第二次打开,鼠标偶尔仍然处于按下的状态擅自选择了一个日期并执行了事件。
1.png

这是一个点击按钮展开日历的一个控件,我们的 Xaml 和 Code-Behind C# 是这样写的:
  1.         <Button
  2.             x:Name="PART_Button"
  3.             Width="100"
  4.             Height="100">
  5.             <Button.Flyout>
  6.                 <Flyout>
  7.                     <Calendar  DataContextChanged="Calendar_DataContextChanged"   />
  8.                 </Flyout>
  9.             </Button.Flyout>
  10.         </Button>
复制代码
  1.         private void Calendar_SelectedDatesChanged_1(object? sender, Avalonia.Controls.SelectionChangedEventArgs e)
  2.         {
  3.             PART_Button.Flyout.Hide();
  4.         }
复制代码
二、解决方法

把事件订阅从 DataContextChanged 改为 路由事件订阅按钮
  1.    <Button
  2.        x:Name="PART_Button"
  3.        Width="100"
  4.        Height="100">
  5.        <Button.Flyout>
  6.            <Flyout>
  7.                <Calendar Button.Click="Calender_ButtonClick" />
  8.            </Flyout>
  9.        </Button.Flyout>
  10.    </Button>
复制代码
  1.         private void Calender_ButtonClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
  2.         {
  3.             if (e.Source is not CalendarDayButton) return;
  4.             PART_Button.Flyout.Hide();
  5.         }
复制代码
三、如果路由事件写不上怎么办?

你可以在 Code-Behind C# 的代码部分随着控件初始化的时候附加,就像这样:
  1.    <Button
  2.        x:Name="PART_Button"
  3.        Width="100"
  4.        Height="100">
  5.        <Button.Flyout>
  6.            <Flyout>
  7.                <Calendar Button.Click="Calender_ButtonClick" />
  8.            </Flyout>
  9.        </Button.Flyout>
  10.    </Button>
复制代码
C# 的部分请这样做。
  1.         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)
  2.         {
  3.             if (e.Source is not CalendarDayButton) return;
  4.             PART_Button.Flyout.Hide();
  5.         }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册