У меня проблема с прокруткой колесика мыши для работы в следующем XAML, который я упростил для ясности:
<ScrollViewer
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible"
CanContentScroll="False"
>
<Grid
MouseDown="Editor_MouseDown"
MouseUp="Editor_MouseUp"
MouseMove="Editor_MouseMove"
Focusable="False"
>
<Grid.Resources>
<DataTemplate
DataType="{x:Type local:DataFieldModel}"
>
<Grid
Margin="0,2,2,2"
>
<TextBox
Cursor="IBeam"
MouseDown="TextBox_MouseDown"
MouseUp="TextBox_MouseUp"
MouseMove="TextBox_MouseMove"
/>
</Grid>
</DataTemplate>
</Grid.Resources>
<ListBox
x:Name="DataFieldListBox"
ItemsSource="{Binding GetDataFields}"
SelectionMode="Extended"
Background="Transparent"
Focusable="False"
>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemContainerStyle>
<Style
TargetType="ListBoxItem"
>
<Setter
Property="Canvas.Left"
Value="{Binding dfX}"
/>
<Setter
Property="Canvas.Top"
Value="{Binding dfY}"
/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
</Grid>
</ScrollViewer>
Визуально результат - это область некоторого известного размера, где DataField
, читаемый из коллекции, может быть представлен TextBox
es, которые имеют произвольное положение, размер и т.д. В случаях, когда ListBox
стиль "area" слишком велик, чтобы отображать все сразу, возможна горизонтальная и вертикальная прокрутка, но только с полосами прокрутки.
Для лучшей эргономики и здравомыслия, прокрутка колесика мыши должна быть возможной, и обычно ScrollViewer
будет обрабатывать ее автоматически, но ListBox
, похоже, передает те события, которые родительский ScrollViewer
никогда не видит. До сих пор мне удалось настроить работу прокрутки колес на IsHitTestVisible=False
для ListBox
или родительского Grid
, но, конечно, после этого события из дочерних элементов мыши не работают.
Что я могу сделать, чтобы ScrollViewer
видел события колесика мыши, сохраняя другие для дочерних элементов?
Изменить: я только что узнал, что ListBox
имеет встроенный ScrollViewer
, который, вероятно, крадет события колеса из родительского ScrollViewer
и что указание шаблона управления может отключить его. Я обновлю этот вопрос, если это решит проблему.