WPF - предотвращение прокрутки колесика мыши в ComboBox и прокрутки, содержащей Listview. - PullRequest
0 голосов
/ 13 марта 2019

У меня есть ListView, DataTemplate которого содержит ComboBox.Я хочу удовлетворить следующие требования:

  1. Элементы ListView можно выбирать
  2. Когда выбран элемент ListView, ComboBox фокусируется, имеет IsDropDownOpen = false и пользователь поворачивает мышьколесом или перемещением клавиатуры вверх / вниз стрелка, я хочу отключить возможность изменения выделения.Это должно быть возможно только тогда, когда ComboBox имеет IsDropDownOpen = true.
  3. Когда выбран элемент ListView и IsDropDownOpen = false в ComboBox, я хочу, чтобы события MouseWheel и KeyDown ComboBox делали прокрутку ListView независимо от того, имеет ли ComboBox выбранный элемент или нет, и от того, является ли онимеет фокус или не имеет.

Следующий упрощенный файл XAML и соответствующий код файла, основанного на этом , показывают, что я пытаюсь сделать

<UserControl x:Class="WpfApp.Users.UserData"
         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="450" d:DesignWidth="800">

<UserControl.Resources>
    <DataTemplate x:Key="listViewItemTemplate">
        <ComboBox Name="cb" MinWidth="150"
                          IsHitTestVisible="False"
                          PreviewMouseWheel="cb_PreviewMouseWheel"
                          PreviewKeyDown="cb_PreviewKeyDown">

            <ComboBoxItem Name="cbi1">Item1</ComboBoxItem>
            <ComboBoxItem Name="cbi2">Item2</ComboBoxItem>
        </ComboBox>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource 
                                    Mode=FindAncestor, AncestorType={x:Type ListViewItem}}, 
                                    Path=IsSelected}" Value="True">
                <Setter TargetName="cb" Property="IsHitTestVisible" Value="True"/>
            </DataTrigger>
        </DataTemplate.Triggers>

    </DataTemplate>

</UserControl.Resources>
<ListView  Name="lv" DockPanel.Dock="Top"
                        VirtualizingStackPanel.IsVirtualizing="True"
                        VirtualizingStackPanel.ScrollUnit="Pixel"
                        VirtualizingStackPanel.VirtualizationMode="Recycling"
                        ScrollViewer.CanContentScroll="True"
                        HorizontalContentAlignment="Stretch"
                        ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                        SelectionMode="Single">
    <ListView.View>
        <GridView>
            <GridViewColumn
                        CellTemplate="{StaticResource listViewItemTemplate}"/>
        </GridView>
    </ListView.View>
</ListView>

    private void cb_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        if (!((ComboBox)sender).IsDropDownOpen) 
        {
            e.Handled = true; 
            MouseWheelEventArgs e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
            e2.RoutedEvent = UIElement.MouseWheelEvent;
            lv.RaiseEvent(e2);
        }
    }

    private void cb_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (!((ComboBox)sender).IsDropDownOpen) 
        {
            e.Handled = true;
            KeyEventArgs e2 = new KeyEventArgs(e.KeyboardDevice, e.InputSource, e.Timestamp, e.Key);
            e2.RoutedEvent = UIElement.KeyDownEvent;
            lv.RaiseEvent(e2);
        }
    }

cb_PreviewKeyDown делает именно то, что я хочу, но cb_PreviewMouseWheel не делает прокрутку ListView, когда выбран элемент ListView и IsDropDownOpen = false ComboBox, false,хотя ListView получает возбужденное событие MouseWheel, как я обнаружил в своих тестах.

Что не так с моим решением?Есть ли другой, который мог бы делать то, что я хочу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...