2014-12-22 6 views
1

В нашем приложении WPF есть ScrollViewer, который содержит различные элементы управления. Когда открывается всплывающее окно с этим ScrollViewer, а затем пользователь использует колесо мыши для прокрутки ScrollViewer, элемент управления со списком перемещается, но раскрывающийся список остается в том же положении, что выглядит неудобно.Выпадающий список выпадающих списков при перемещении combobox

Есть ли простой способ сделать комбобокс закрытым, или положение выпадающего списка для обновления, когда 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 закрыть меню DropDown: 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

Спасибо. Как я писал, я знаю, что могу это сделать, но я хотел получить более общее решение, так как у нас много cmoboboxes и много scrollviewer в нашем приложении. – splintor

Смежные вопросы