轩辕娅童 发表于 2025-10-1 16:17:53

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

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

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

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

这是一个点击按钮展开日历的一个控件,我们的 Xaml 和 Code-Behind C# 是这样写的:
      <Button
            x:Name="PART_Button"
            Width="100"
            Height="100">
            <Button.Flyout>
                <Flyout>

                  <CalendarDataContextChanged="Calendar_DataContextChanged"   />

                </Flyout>

            </Button.Flyout>
      </Button>      private void Calendar_SelectedDatesChanged_1(object? sender, Avalonia.Controls.SelectionChangedEventArgs e)
      {
            PART_Button.Flyout.Hide();
      }二、解决方法

把事件订阅从 DataContextChanged 改为 路由事件订阅按钮
   <Button
       x: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# 的代码部分随着控件初始化的时候附加,就像这样:
   <Button
       x:Name="PART_Button"
       Width="100"
       Height="100">
       <Button.Flyout>
         <Flyout>

               <Calendar Button.Click="Calender_ButtonClick" />

         </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();
      }
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

存叭 发表于 2025-10-25 03:59:19

感谢分享,学习下。

迭婵椟 发表于 2025-10-25 22:19:10

感谢分享,下载保存了,貌似很强大

琦谓 发表于 2025-11-3 21:21:47

谢谢分享,试用一下

殷罗绮 发表于 2025-11-23 09:46:53

谢谢分享,试用一下

梁丘眉 发表于 2025-11-28 22:50:36

懂技术并乐意极积无私分享的人越来越少。珍惜

步雪卉 发表于 2025-12-1 01:36:47

懂技术并乐意极积无私分享的人越来越少。珍惜

仰翡邸 发表于 2026-1-6 18:32:30

这个有用。

欧阳梓蓓 发表于 2026-1-13 21:30:56

感谢,下载保存了

叟减 发表于 2026-1-16 06:56:05

谢谢分享,试用一下

少琼 发表于 2026-1-17 15:07:31

yyds。多谢分享

剧拧并 发表于 2026-1-18 08:08:51

喜欢鼓捣这些软件,现在用得少,谢谢分享!

胁冉右 发表于 2026-1-20 08:05:28

前排留名,哈哈哈

甦忻愉 发表于 2026-1-20 20:11:59

感谢分享

拍棹 发表于 2026-1-23 04:06:26

谢谢楼主提供!

厥轧匠 发表于 2026-1-24 11:29:43

这个有用。

魁睥 发表于 2026-1-25 11:08:13

东西不错很实用谢谢分享

能杜孱 发表于 2026-1-25 12:34:26

用心讨论,共获提升!

掳诚 发表于 2026-1-29 02:25:47

喜欢鼓捣这些软件,现在用得少,谢谢分享!

空娅芬 发表于 2026-1-29 05:53:58

感谢分享
页: [1] 2 3
查看完整版本: Avalonia Calendar 日历控件遇到 Flyout 或者切换页面时出现的鼠标按下失效的解决方法