2011-05-16 78 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