2014-12-22 94 views
1

我們的WPF應用程序有一個包含各種控件的ScrollViewer。當打開此ScrollViewer的組合框被打開,然後用戶使用鼠標滾輪滾動ScrollViewer時,組合框控件移動,但下拉列表保持在相同的位置,這看起來很尷尬。組合框移動時處理組合框下拉

是否有一種簡單的方法可以使組合框關閉,或者當ScrollViewer滾動並更改組合框位置時更新下拉列表的位置?

我知道我可以處理鼠標滾輪事件,但我有許多這樣的情況與ScrollViewer中包含的組合框,並希望聽到更好的解決方案。

回答

0

我通過增加處理得App.xaml.cs中的以下代碼:

EventManager.RegisterClassHandler(typeof(ComboBox), UIElement.GotFocusEvent, new RoutedEventHandler(SetSelectedComboBox)); 
EventManager.RegisterClassHandler(typeof(ScrollViewer), UIElement.MouseWheelEvent, new MouseWheelEventHandler(OnMouseWheelEvent)); 

private static WeakReference<ComboBox> _selectedComboBox; 

private static void SetSelectedComboBox(object sender, RoutedEventArgs e) 
{ 
    _selectedComboBox = new WeakReference<ComboBox>(sender as ComboBox); 
} 

// Close dropdown when scrolling with the mouse wheel - QM001866525 
private static void OnMouseWheelEvent(object sender, MouseWheelEventArgs e) 
{ 
    if (_selectedComboBox == null || Environment.GetEnvironmentVariable("DONT_CLOSE_COMBO_ON_MOUSE_WHEEL") == "1") 
    { 
     return; 
    } 

    ComboBox combo; 
    if (_selectedComboBox.TryGetTarget(out combo) && combo.IsDropDownOpen) 
    { 
     combo.IsDropDownOpen = false; 
    } 
} 
0

,你可以處理ScrollChanged事件ScollViewer和強制ComboBox關閉下拉菜單: 的XAML

<ScrollViewer VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ScrollChanged="ScrollViewer_OnScrollChanged"> 
     <Grid Height="700"> 
      <ComboBox x:Name="comboBox" VerticalAlignment="Center" HorizontalAlignment="Center"> 
       <ComboBoxItem Content="Elt One"/> 
       <ComboBoxItem Content="Elt Two"/> 
       <ComboBoxItem Content="Elt Three"/> 
      </ComboBox> 
     </Grid> 
    </ScrollViewer> 

,並在後面的代碼:

private void ScrollViewer_OnScrollChanged(object sender, ScrollChangedEventArgs e) 
    { 
     comboBox.IsDropDownOpen = false; 
    } 
+0

謝謝。正如我寫的,我知道我可以做到這一點,但我想要一個更通用的解決方案,因爲我們的應用中有很多cmobobox和許多滾動查看器。 – splintor