2015-10-22 2 views
2

Есть ли способ предотвратить прокрутку прокрутки прокрутки ScrollViewer?Предотвращение использования ScrollViewer для события мыши.

Следующий код не является достаточным, поскольку событие должно быть обработано с помощью дочернего элемента ScrollViewer вместо:

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

EDIT - @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}" это неправильно, но я не то, что вместо этого писать.

+0

Я приложил мой ответ на ваш новый вопрос в моем ответе. –

ответ

2

EDIT - это лучшее решение.

Вы можете установить e.Handled = true в обработчике событий PreviewMouseWheel ScrollViewer, а затем по-прежнему обрабатывать событие в другом элементе управления.

Например, предположим, что у меня есть кнопка внутри сетки в содержимом 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"); 
} 

Это ответ на новый вопрос ,

Дайте PlotView имя в XAML и привяжите модель к свойству 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"); 
} 

Старый решение:

Создание суб-класса ScrollViewer который отвечает отрицательно на все запросы HitTest, похоже, решает вашу проблему, однако может иметь побочные эффекты th у вас не нравится. Проверьте это и посмотрите, подходит ли она для ваших нужд.

Во-первых, создать суб-класс:

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

Затем в XAML, изменять <ScrollViewer> к <local:MyScrollViewer>.

Убедитесь, что объявлено локальное пространство имен.Это будет выглядеть примерно так:

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

+0

Спасибо за ваш ответ. Я попробовал, но ничего не изменил. – Henste

+0

Я отредактировал свой ответ - надеюсь, это сработает для вас. –

+0

Я ценю ваши усилия. К сожалению, у меня нет стандартного элемента интерфейса в Scrollviewer, но Oxyplot.Wpf.PlotView. У него нет такого метода, как 'AddHandler()'. – Henste

Смежные вопросы