簡體   English   中英

防止 ScrollViewer 處理鼠標滾輪事件

[英]Prevent ScrollViewer from handling Mouse Wheel Event

有沒有辦法防止 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}"是錯誤的,但我不知道該寫什么。

編輯 - 這是一個更好的解決方案。

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

例如,假設我在 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 命名,並將模型綁定到 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>

確保聲明了本地命名空間。 它看起來像這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM