2011-05-16 53 views
9

因此,我放弃了标准的WPF Calendar控件在MainWindow.xaml中的一个全新的WPF应用程序在VS2010中。如果我点击日历中的某一天,然后尝试点击该应用的关闭按钮,则必须在接受点击之前点击两次关闭按钮。它的行为好像Calendar尚未释放鼠标以与应用程序的其余部分进行交互。WPF日历控件坚持鼠标

我已将Focusable更改为false,但效果未发生变化,并且我尝试覆盖PreviewOnMouseUp并致电ReleaseMouseCapture()无济于事。我用MouseLeaveMouseLeftButtonUp完成了相同的结果。鉴于这些事情都不起作用,我怀疑我正在吠叫错误的树。谷歌已经没有什么值得注意的了,但也许我的GoogleFu今天还没有达到遏制。

任何想法?

回答

1

日历控件托管在弹出窗口中,并捕获鼠标。当您第一次点击其他地方时,捕获将点击发送到弹出窗口,意识到您已经点击了它自己以外的地方,关闭。点击因此不会进入按钮。

使用ComboBox时可以看到相同的效果。把它放下来,然后点击一个按钮。它不会点击按钮。

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

编辑:更新版本的.NET使解决方案成为可能。见Eren的答案。

+0

我没有看到有关的任何在日历类层次结构中弹出。 Calendar-> Control-> etc ...-> Object – 2011-05-16 23:13:30

+0

@Ritch Melton:它仍然可以在其Template模板中使用任意控件,ComboBox不会从这些类继承,也可以在内部使用Popup。 – 2011-05-16 23:18:50

+0

@ H.B。啊,好的。这就说得通了。 – 2011-05-16 23:20:04

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> 
+0

随意编辑以使其更加通用 - 我已经完全从我当前的代码库中删除了最相关的部分,并且不想编辑太多以防止我破坏它。 – Zooba 2011-10-24 09:38:13

27

您可以通过订阅日历的PreviewMouseUp事件有了这样的处理程序更改此行为:

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

这应该真的被标记为答案。接受的答案告诉你为什么会发生,这个告诉你如何阻止它发生。 – 2013-02-25 06:51:33

1

此代码必须帮助

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

不仅这不起作用,还引入了日历的某些部分中的单击关闭父窗口的效果。 – Edza 2015-02-19 11:18:47