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

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

省流:把事件订阅从 DataContextChanged 改为路由事件订阅

一、背景

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

image

这是一个点击按钮展开日历的一个控件,我们的 Xaml 和 Code-Behind C# 是这样写的:

        <Button
            x: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 改为 路由事件订阅按钮

   <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 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();
        }
posted @ 2025-09-11 09:40  fanbal  阅读(26)  评论(0)    收藏  举报