gpt4 book ai didi

c# - 阻止 ScrollViewer 处理鼠标滚轮事件

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:37 24 4
gpt4 key购买 nike

有没有办法阻止 ScrollViewer 处理鼠标滚动?

以下代码是不够的,因为事件应该由 ScrollViewer 的子元素处理:

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
e.Handled = true;
}

编辑 - @Anders Keller Carstensen

我曾经直接实例化一个 PlotModel 对象,这就是为什么我没有看到 AddHandler() 方法的原因。我现在更改了我的代码,但情节没有显示任何内容:

public OxyPlot.Wpf.PlotView Plot { get; set; }

public MainWindow()
{
InitializeComponent();
DataContext = this;

Plot = new OxyPlot.Wpf.PlotView();
Plot.Model = new PlotModel();

Plot.AddHandler(System.Windows.UIElement.PreviewMouseWheelEvent, new MouseWheelEventHandler(Plot_PreviewMouseWheel), true);

// Create Line series
var s1 = new LineSeries();
s1.Points.Add(new DataPoint(2, 7));
s1.Points.Add(new DataPoint(7, 9));
s1.Points.Add(new DataPoint(9, 4));

// add Series and Axis to plot model
Plot.Model.Series.Add(s1);
Plot.Model.InvalidatePlot(false);
}

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
e.Handled = true;
}

private void Plot_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
MessageBox.Show("Button_PreviewMouseWheel");
}

这是相应的 XAML:

<ScrollViewer Margin="0,25,0,0" PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">
<oxy:PlotView Model="{Binding Plot}" Height="2000" Margin="0,0,15,0" />
</ScrollViewer>

我确定 Model="{Binding Plot}" 是错误的,但我不知道该写什么。

最佳答案

编辑 - 这是一个更好的解决方案。

可以设置e.Handled = true在 ScrollViewer 的 PreviewMouseWheel 事件处理程序中,然后仍然在您的其他控件中处理该事件。

例如,假设我在 ScrollViewer 的内容中的网格内有一个按钮。在窗口的构造函数中,我订阅了按钮的 PreviewMouseWheel 事件,如下所示:

public ScrollViewerWindow() {
InitializeComponent();

btn.AddHandler(UIElement.PreviewMouseWheelEvent,
new MouseWheelEventHandler(Button_PreviewMouseWheel),
true // Handler will be called even though e.Handled = true
);
}

那么您的事件句柄将如下所示:

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e) {
e.Handled = true;
}

private void Button_PreviewMouseWheel(object sender, MouseWheelEventArgs e) {
MessageBox.Show("Button_PreviewMouseWheel");
}

这是对您的新问题的回答。

在 XAML 中为 PlotView 命名,并将模型绑定(bind)到 PlotModel 属性。

<ScrollViewer Margin="0,25,0,0" PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">
<oxy:PlotView x:Name="pv" Model="{Binding PlotModel}" Height="2000" Margin="0,0,15,0" />
</ScrollViewer>

在您的代码隐藏中,您应该添加 PlotModel 属性并对其进行初始化:

public PlotModel PlotModel { get; set; }

public MainWindow()
{
InitializeComponent();
DataContext = this;

pv.AddHandler(System.Windows.UIElement.PreviewMouseWheelEvent, new MouseWheelEventHandler(Plot_PreviewMouseWheel), true);

// Create Line series
var s1 = new LineSeries();
s1.Points.Add(new DataPoint(2, 7));
s1.Points.Add(new DataPoint(7, 9));
s1.Points.Add(new DataPoint(9, 4));

// add Series and Axis to plot model
PlotModel = new PlotModel();
PlotModel.Series.Add(s1);
PlotModel.InvalidatePlot(false);
}

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
e.Handled = true;
}

private void Plot_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
MessageBox.Show("Plot_PreviewMouseWheel");
}

旧的解决方案:

<罢工>创建一个对所有 HitTest 请求都做出否定响应的 ScrollViewer 子类似乎可以解决您的问题——但是,它可能会产生您不喜欢的副作用。检查一下,看看它是否适合您的需求。

首先,创建子类:

public class MyScrollViewer : ScrollViewer {
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters) {
return null;
}
}

然后,在 XAML 中,更改 <ScrollViewer><local:MyScrollViewer> .

确保本地 namespace 已声明。它看起来像这样:

<Window ....
xmlns:local="clr-namespace:WPFTest">

<罢工>

关于c# - 阻止 ScrollViewer 处理鼠标滚轮事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33276268/

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