Нарисуйте прямоугольник на холсте, который находится в ScrollViewer, с помощью мыши и касания

У меня есть Canvas внутри ScrollViewer.

<ScrollViewer x:Name="svWorkSpace" Visibility="Collapsed" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
                      Tapped="svWorkSpace_Tapped"
                      PointerPressed="svWorkSpace_PointerPressed"
                      PointerMoved="svWorkSpace_PointerMoved"
                      PointerReleased="svWorkSpace_PointerReleased">
            <Grid>
                <Image x:Name="cvWorkImage"/>
                <Canvas x:Name="cvWorkSpace"/>
            </Grid>
        </ScrollViewer>

В коде PointerPressed я фиксирую начальную точку, а в коде PointerMoved я рисую прямоугольник по мере перемещения указателя (также удаляю замыкающий прямоугольник при перемещении, сохраняя только один прямоугольник в холст. С помощью этого метода я добиваюсь эффекта размера прямоугольника). PointerReleased примет последний прямоугольник.

Все работает нормально, используя мышь на сенсорном устройстве, но не используя палец. Изображение просто прокручивается, когда я двигаю пальцем.

Пытался переместить код в Canvas, как показано ниже. Не удалось нарисовать прямоугольник с помощью мыши и касания.

<ScrollViewer x:Name="svWorkSpace" Visibility="Collapsed" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
            <Grid>
                <Image x:Name="cvWorkImage"/>
                <Canvas x:Name="cvWorkSpace"
                      Tapped="svWorkSpace_Tapped"
                      PointerPressed="svWorkSpace_PointerPressed"
                      PointerMoved="svWorkSpace_PointerMoved"
                      PointerReleased="svWorkSpace_PointerReleased"/>

            </Grid>
        </ScrollViewer>

Направьте меня в правильном направлении, пожалуйста.


person MNHarun    schedule 13.09.2014    source источник


Ответы (1)


Когда ScrollViewer получает PointerPressed на основе касания, он переходит к Direct Manipulation, чтобы реагировать на панорамирование и масштабирование. Direct Manipulation фиксирует ввод указателя, поэтому события Canvas PointerMoved и PointerReleased не срабатывают. Нет событий -> нет рисования.

ScrollViewer перемещается или масштабируется с помощью мыши, поэтому события мыши передаются на холст.

Предполагая, что вы всегда хотите, чтобы Canvas обрабатывал события указателя, а не прокручивал ScrollViewer

<Canvas x:Name="cvWorkSpace"
    Background={ThemeResource WorkSpaceBackgroundBrush}
    Tapped="svWorkSpace_Tapped"
    ManipulationMode="All"
    PointerPressed="svWorkSpace_PointerPressed"
    PointerMoved="svWorkSpace_PointerMoved"
    PointerReleased="svWorkSpace_PointerReleased"/>

Если вы хотите, чтобы Canvas обрабатывал события указателя только иногда, вы можете переключить ManipulationMode обратно в System, чтобы позволить ScrollViewer обрабатывать его. Если вы хотите рисовать на холсте с помощью одного касания и панорамировать/масштабировать с помощью мультитач, вы можете обрабатывать события манипулирования на холсте для панорамирования и масштабирования.

Также убедитесь, что Canvas не прозрачен и позволяет событиям указателя проходить к тому, что находится за ним. Если вы хотите рисовать поверх изображения, вы можете установить ImageBrush с изображением в качестве фона холста, а не использовать отдельный элемент управления Image.

person Rob Caplan - MSFT    schedule 03.10.2014