gpt4 book ai didi

wpf - 滚动查看器的子元素阻止用鼠标滚轮滚动?

转载 作者:行者123 更新时间:2023-12-02 07:08:02 26 4
gpt4 key购买 nike

我在以下 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 表示。如果ListBox的样式“区域”太大而无法一次显示全部内容,则可以进行水平和垂直滚动,但只能使用滚动条。

为了更好的人体工程学和理智,鼠标滚轮滚动应该是可能的,通常 ScrollViewer 会自动处理它,但 ListBox 似乎正在处理这些事件,以便父 ScrollViewer 永远不会看到它们。到目前为止,我只能通过为 ListBox 或父 Grid 设置 IsHitTestVisible=False 来使滚轮滚动工作,但是当然此后子元素的鼠标事件都不起作用。

如何确保 ScrollViewer 看到鼠标滚轮事件,同时保留其他子元素事件?

编辑:我刚刚了解到 ListBox 有一个内置的 ScrollViewer 它可能从父 ScrollViewer 窃取滚轮事件并指定控制模板可以禁用它。如果问题得到解决,我会更新此问题。

最佳答案

您还可以创建一个行为并将其附加到父控件(滚动事件应在其中冒泡)。

// Used on sub-controls of an expander to bubble the mouse wheel scroll event up 
public sealed class BubbleScrollEvent : Behavior<UIElement>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.PreviewMouseWheel += AssociatedObject_PreviewMouseWheel;
}

protected override void OnDetaching()
{
AssociatedObject.PreviewMouseWheel -= AssociatedObject_PreviewMouseWheel;
base.OnDetaching();
}

void AssociatedObject_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
e.Handled = true;
var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
e2.RoutedEvent = UIElement.MouseWheelEvent;
AssociatedObject.RaiseEvent(e2);
}
}

<SomePanel>
<i:Interaction.Behaviors>
<viewsCommon:BubbleScrollEvent />
</i:Interaction.Behaviors>
</SomePanel>

关于wpf - 滚动查看器的子元素阻止用鼠标滚轮滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14348517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com