предотвратить ScrollViewer проглотить MouseWheelEvent (обновление: DevExpress LayoutControl является причиной)

У меня есть UserControl, содержащий ScrollViewer, который содержит холст. У меня есть настраиваемая логика масштабирования, но если ScrollViewer может прокручивать, он полностью проглатывает событие колеса мыши. При достижении дна масштабирование работает без проблем.

    private void CanvasOverlayControl_PreviewMouseWheel(object sender, MouseWheelEventArgs e) {
        if(Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) {
            if(e.Delta > 0) {
                // Wheel up
                Zoom *= 1.15f;
            } else if(e.Delta < 0) {
                // Wheel down
                Zoom *= 0.85f;
            }
        }
    }

эта строка находится в конструкторе (код позади)

        PreviewMouseWheel += CanvasOverlayControl_PreviewMouseWheel;

Как я могу подавить такое поведение?

Изменить:

Я обнаружил, что DevExpress LayoutControl вызывает это, потому что он обрабатывает прокрутку контента. Есть ли способ отключить это?

заранее спасибо


person horotab    schedule 28.08.2017    source источник


Ответы (1)


Начнем с основ ... убедитесь, что Canvas действительно получает какие-либо события мыши. Требуется некоторый фон, чтобы разрешить проверку попадания

<Canvas Background="Transparent"

Для меня поражен PreviewMouseWheel холста, и я могу отключить прокрутку родительского элемента, установив e.Handled = true;.

Изменить: образец проекта:

<Window x:Class="WpfTests_2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        ...
        Title="MainWindow" Height="350" Width="525">
    <Grid x:Name="grid1">
        <ScrollViewer>
            <Canvas Background="Green" PreviewMouseWheel="Canvas_PreviewMouseWheel" Width="300" Height="1200"/>
        </ScrollViewer>
    </Grid>
</Window>

Код позади

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

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

Наблюдаемый результат: когда мышь находится над зеленой областью холста, прокрутка колесом мыши отсутствует. Когда мышь находится за пределами холста, средство просмотра прокрутки прокручивает.

person grek40    schedule 28.08.2017
comment
Я пробовал это, но мой метод вызывается только в том случае, если ScrollViewer больше не может прокручивать. - person horotab; 28.08.2017
comment
@horotab отредактировал моим примером кода. Пожалуйста, попробуйте проверить, получите ли вы тот же результат для того же кода. Если вы можете воспроизвести мой образец, вам нужно выяснить, что изменилось в вашем реальном проекте. Если вы не можете воспроизвести, значит, наши системы как-то сильно отличаются, и я, вероятно, не могу вам помочь. - person grek40; 28.08.2017
comment
@horotab вы проверили пример? Вопрос все еще открыт? - person grek40; 29.08.2017
comment
Да, я обнаружил, что проблема в том, что у меня есть Devexpress.LayoutControl, который не обрабатывает прокрутку. Вы, может быть, знаете, как этого избежать? Я не хочу создавать UI с сетками :( - person horotab; 29.08.2017
comment
@horotab Извините, я не знаком с DevExpress. Если вы все еще ожидаете ответа, вам нужно обновить свой вопрос этой новой информацией. - person grek40; 29.08.2017