【发布时间】:2012-12-30 04:30:45
【问题描述】:
我在让鼠标滚轮滚动以在以下 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>
在视觉上,结果是某个已知大小的区域,其中从集合中读取的DataFields 可以用具有任意位置、大小等的TextBoxes 表示。如果ListBox 的样式“区域”太大而无法一次全部显示,则可以进行水平和垂直滚动,但只能使用滚动条。
为了更好的人体工程学和理智,鼠标滚轮滚动应该是可能的,通常ScrollViewer 会自动处理它,但ListBox 似乎正在处理这些事件,这样父级ScrollViewer 永远不会看到它们。到目前为止,我只能为ListBox 或父Grid 设置IsHitTestVisible=False,但当然此后子元素的鼠标事件都不起作用。
我可以做些什么来确保ScrollViewer 看到鼠标滚轮事件,同时为子元素保留其他事件?
编辑:我刚刚了解到ListBox 有一个内置的ScrollViewer,它可能会从父级ScrollViewer 窃取滚轮事件,并且指定控制模板可以禁用它。如果问题解决了,我会更新这个问题。
【问题讨论】:
标签: wpf event-handling listbox scrollviewer mousewheel