У меня есть ListView, DataTemplate которого содержит ComboBox.Я хочу удовлетворить следующие требования:
- Элементы ListView можно выбирать
- Когда выбран элемент ListView, ComboBox фокусируется, имеет IsDropDownOpen = false и пользователь поворачивает мышьколесом или перемещением клавиатуры вверх / вниз стрелка, я хочу отключить возможность изменения выделения.Это должно быть возможно только тогда, когда ComboBox имеет IsDropDownOpen = true.
- Когда выбран элемент 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, как я обнаружил в своих тестах.
Что не так с моим решением?Есть ли другой, который мог бы делать то, что я хочу?