Have to click away twice from Calendar in WPF

后端 未结 7 1851
南旧
南旧 2021-02-01 19:17

Edit 2: Thank you all for your feedback. I solved the problem by adding this to my SelectedDatesChanged event:

Mouse.Capture(null);

When I select a

7条回答
  •  别跟我提以往
    2021-02-01 19:51

    So it seems the Calendar captures the Mouse exclusively, One option could be to make a AttachedProperty to release the capture when the user clicks

    Example:

    public static class CalandarHelper 
    {
        public static readonly DependencyProperty SingleClickDefocusProperty =
            DependencyProperty.RegisterAttached("SingleClickDefocus", typeof(bool), typeof(Calendar)
            , new FrameworkPropertyMetadata(false, new PropertyChangedCallback(SingleClickDefocusChanged)));
    
        public static bool GetSingleClickDefocus(DependencyObject obj) {
            return (bool)obj.GetValue(SingleClickDefocusProperty);
        }
    
        public static void SetSingleClickDefocus(DependencyObject obj, bool value) {
            obj.SetValue(SingleClickDefocusProperty, value);
        }
    
        private static void SingleClickDefocusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is Calendar) 
            {
                Calendar calendar = d as Calendar;
                calendar.PreviewMouseDown += (a, b) =>
                {
                    if (Mouse.Captured is Calendar || Mouse.Captured is System.Windows.Controls.Primitives.CalendarItem)
                    {
                        Mouse.Capture(null);
                    }
                };
            }
        }
    }
    

    Now you can apply this AttachedProperty to your Calender and it will defocus once an item is selected.

    Full Example:

    Xaml:

    
    
        
            
            
        
    
    

    Code:

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    
    namespace WpfApplication2 
    {
        /// 
        /// Interaction logic for MainWindow.xaml
        /// 
        public partial class MainWindow : Window 
        {
            public MainWindow() 
            {
                InitializeComponent();
            }
        }
    
        public static class CalandarHelper 
        {
            public static readonly DependencyProperty SingleClickDefocusProperty =
                DependencyProperty.RegisterAttached("SingleClickDefocus", typeof(bool), typeof(Calendar)
                , new FrameworkPropertyMetadata(false, new PropertyChangedCallback(SingleClickDefocusChanged)));
    
            public static bool GetSingleClickDefocus(DependencyObject obj) {
                return (bool)obj.GetValue(SingleClickDefocusProperty);
            }
    
            public static void SetSingleClickDefocus(DependencyObject obj, bool value) {
                obj.SetValue(SingleClickDefocusProperty, value);
            }
    
            private static void SingleClickDefocusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if (d is Calendar) 
                {
                    Calendar calendar = d as Calendar;
                    calendar.PreviewMouseDown += (a, b) =>
                    {
                        if (Mouse.Captured is Calendar || Mouse.Captured is System.Windows.Controls.Primitives.CalendarItem)
                        {
                            Mouse.Capture(null);
                        }
                    };
                }
            }
        }
    }
    

提交回复
热议问题