WPF日历控件保持鼠标

时间:2011-05-16 23:02:02

标签: c# wpf calendar

所以我在VS2010的全新WPF应用程序中删除了MainWindow.xaml上的标准WPF Calendar控件。如果我单击日历中的某一天,然后尝试单击该应用程序的“关闭”按钮,则必须在关闭按钮上单击两次才能接受该单击。它就像Calendar没有释放鼠标与应用程序的其余部分进行交互一样。

我已将Focusable更改为false,但效果没有变化,我尝试覆盖PreviewOnMouseUp并调用ReleaseMouseCapture()无效。我对MouseLeaveMouseLeftButtonUp做了同样的事情,结果相同。鉴于这些东西都不起作用我怀疑我正在咆哮错误的树。虽然也许我的GoogleFu今天不能满足要求,但谷歌已经没有注意到了。

有什么想法吗?

4 个答案:

答案 0 :(得分:29)

您可以通过使用如下处理程序订阅日历的PreviewMouseUp事件来更改此行为:

private void Calendar_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    if (Mouse.Captured is CalendarItem)
    {
        Mouse.Capture(null);
    }
}

答案 1 :(得分:2)

日历控件托管在弹出窗口中,并捕获鼠标。当您第一次单击其他位置时,捕获会将单击发送到弹出窗口,这会意识到您已在自身外部单击,然后关闭。因此,点击不会转到按钮。

使用ComboBox时可以看到相同的效果。将其放下,然后单击按钮。它不会单击按钮。

不幸的是,你不可能做任何改变这种行为的事情。

编辑:更新版本的.NET可以提供解决方案。见Eren的回答。

答案 2 :(得分:1)

这是我用来解决鼠标捕获问题和子控件缺少Click事件的代码的基础。它可以进一步简化,使日历控件更容易直接访问,但我个人倾向于将它添加到UserControl中。

class FixedCalendar : UserControl
{
    public FixedCalendar()
    {
        InitializeComponent();
    }

    protected override void OnPreviewMouseUp(MouseButtonEventArgs e)
    {
        base.OnPreviewMouseUp(e);
        if (Mouse.Captured is System.Windows.Controls.Primitives.CalendarItem)
        {
            Mouse.Capture(null);

            var element = e.OriginalSource as FrameworkElement;
            if (element != null)
                element.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
        }
    }
}

<UserControl x:Class="FixedCalendar"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Calendar x:Name="Calendar" />
</UserControl>

答案 3 :(得分:1)

此代码必须提供帮助

Calendar.PreviewMouseUp += (o, e) =>
{
    if (!e.OriginalSource.Equals(Calendar))
    {
        Mouse.Capture(null);
    }
};