在wpf中禁用itemscontrol上的鼠标滚轮

我有一个带有滚动查看器的用户控件,然后有很多子控件,例如文本框,单选按钮和列表框等。我可以使用鼠标滚轮滚动父滚动查看器,直到我的鼠标降落在列表框内,然后,鼠标滚轮事件开始进入列表框。有什么办法可以使列表框将这些事件发送回父控件?像这样的问题,从父控件的内部删除列表框(在ScrollViewer的子控件上方时鼠标滚轮不起作用)不是解决方案。

我努力了

void ListBox_PreviewMouseWheel(object sender, MouseWheelEventArgs e)

{

e.Handled = true;

}

但这也不起作用。

谢谢

回答:

您所引用的答案正是导致问题的原因,ScrollViewer中的ListBox(由ScrollViewer等组成)捕获MouseWheel事件并对其进行处理,防止其冒泡,因此ScrollViewer不知道该事件曾经发生过。

为您的ListBox使用以下极其简单的ControlTemplate进行演示(请注意,其中没有ScrollViewer,因此不会捕获MouseWheel事件)ScrollViewer仍将使用鼠标在ListBox上滚动。

<UserControl.Resources>

<ControlTemplate x:Key="NoScroll">

<ItemsPresenter></ItemsPresenter>

</ControlTemplate>

</UserControl.Resources>

<ScrollViewer>

<SomeContainerControl>

<.... what ever other controls are inside your ScrollViewer>

<ListBox Template="{StaticResource NoScroll}"></ListBox>

<SomeContainerControl>

</ScrollViewer>

您确实可以选择在进入ScrollViewer时捕获鼠标,因此它将继续接收所有鼠标事件,直到释放鼠标为止,但是,如果您选择此选项,则需要将其他任何鼠标事件分配给ScrollViewer中包含的控件。想要响应…下面的MouseEnter

MouseLeave事件处理程序就足够了。

private void ScrollViewerMouseEnter(object sender, MouseEventArgs e)

{

((ScrollViewer)sender).CaptureMouse();

}

private void ScrollViewerMouseLeave(object sender, MouseEventArgs e)

{

((ScrollViewer)sender).ReleaseMouseCapture();

}

但是,我提供的两种解决方法都不是真正的首选,我建议您重新考虑您实际上要尝试执行的操作。如果您解释您要解决的问题,我相信您会得到更多建议…

以上是 在wpf中禁用itemscontrol上的鼠标滚轮 的全部内容, 来源链接: utcz.com/qa/413194.html

回到顶部