2011-04-27 74 views
14

我有一個彈出窗口,其中包含StaysOpen=False,所以我想通過單擊彈出窗口以外的任何地方關閉它。在彈出窗口中,我有一個DataGrid。如果我打開彈出窗口,然後單擊其他地方彈出窗口將被關閉。但是,如果在點擊彈出窗口之前我不會點擊DataGrid中的列標題。測試XAML:當彈出窗口中的datagrid捕獲鼠標時,wpf彈出窗口不會自動關閉

<Window x:Class="Test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"> 
<Grid> 
    <ToggleButton x:Name="btn" VerticalAlignment="Top">Open</ToggleButton> 
    <Popup StaysOpen="False" IsOpen="{Binding IsChecked, ElementName=btn}" > 
     <DataGrid Width="150" Height="150"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Column" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Popup> 
</Grid> 
</Window> 

我認爲這是因爲列標題捕獲鼠標點擊和彈出不再接收鼠標事件。我試圖在LostMouseCapture事件中添加一個處理程序,以便通過彈出窗口捕獲鼠標,但它似乎並不那麼容易。有任何想法嗎?

回答

2

我想你已經偶然發現了一個普通的舊bug。我已經複製了這個,並找不到一個合理的方式來讓它工作。我認爲你應該向微軟提交一個bug。它好像是一個捕獲鼠標的組件,它不會將捕獲恢復到最初的捕獲組件。

2

我最近有一個類似的問題,儘管不完全一樣,它在Silverlight中。我通過在GetTemplatedParent函數中搜索所需的控件(在我的情況下彈出窗口),在'misbehaving'控件的所需事件處理程序中編寫了一些我想要對其執行的操作,從而破壞了我的方式。

這不是一個很好的解決方案,並不能解決所有的問題,但你可以試試看。確保你評論你做了什麼,因爲它會變成一團糟。

0

我有同樣的問題,並做了這樣的事情:

private void YourDataGrid_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     YourDataGrid.CaptureMouse(); 
     YourDataGrid.ReleaseMouseCapture(); 
    } 

但我正在尋找的東西更好,但...

4

也許會有所幫助。 附加行爲:

public class DataGridColumnHeaderReleaseMouseCaptureBehavior { 
    public static DataGrid GetReleaseDGCHeaderBehavior(DependencyObject obj) { 
     return (DataGrid)obj.GetValue(ReleaseDGCHeaderBehaviorProperty); 
    } 

    public static void SetReleaseDGCHeaderBehavior(DependencyObject obj, Boolean value) { 
     obj.SetValue(ReleaseDGCHeaderBehaviorProperty, value); 
    } 

    public static readonly DependencyProperty ReleaseDGCHeaderBehaviorProperty = 
     DependencyProperty.RegisterAttached("ReleaseDGCHeaderBehavior", 
      typeof(DataGrid), 
      typeof(DataGridColumnHeaderReleaseMouseCaptureBehavior), 
      new UIPropertyMetadata(default(DataGrid), OnReleaseDGCHeaderBehaviorPropertyChanged)); 

    private static Popup _popup; 

    private static void OnReleaseDGCHeaderBehaviorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
     var oldGrid = (DataGrid)e.OldValue; 
     if (oldGrid != null) 
      oldGrid.MouseLeave -= OnMouseLeave; 
     var refSender = d as Popup; 
     _popup = refSender; 
     if (refSender != null) { 
      var refGrid = e.NewValue as DataGrid; 
      if (refGrid != null) { 
       refGrid.MouseLeave += OnMouseLeave; 
      } 
     } 
    } 
    static void OnMouseLeave(object sender, MouseEventArgs args) { 
     if (_popup != null) 
      typeof(Popup).GetMethod("EstablishPopupCapture", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(_popup, null); 
    } 
} 

XAML:

<Popup x:Name="popup" 
bhvrs:DataGridColumnHeaderReleaseMouseCaptureBehavior.ReleaseDGCHeaderBehavior="{Binding ElementName=dataGrid}"> 
    <DataGrid x:Name="dataGrid"/> 
</Popup> 
+0

這個工程......應標記爲答案:) – user589195 2013-10-16 09:29:46