Как рисовать на изображении и перемещать его? в UWP

Здравствуйте, я прочитал этот Отображение фонового изображения на холсте рукописного ввода UWP для своей разработки

Так что я могу нарисовать изображение и сохранить его.

И я тоже хочу переместить изображение.

У меня 2 проблемы с контролем изображения

Во-первых, когда я перемещаю изображение Popup UI, я не могу рисовать на нем.

А во-вторых, когда я использую только элемент управления сеткой, я не могу перемещать изображение.

--- Вот мой код xaml (только Grid) ---

<Grid x:Name = "img_grid3" Width = "600" Height = "500" HorizontalAlignment = "Center" VerticalAlignment = "Bottom" ManipulationDelta = "img_grid3_ManipulationDelta">
        <Image VerticalAlignment = "Top" HorizontalAlignment = "Left" x:Name = "img3" Stretch = "Fill" Height = "400" Width = "600" >
        </Image>
        <InkCanvas x:Name = "img_inkcanvas3"/>
        <InkToolbar x:Name = "img_inktoolbar3" Canvas.ZIndex = "8" TargetInkCanvas = "{x:Bind img_inkcanvas3}" VerticalAlignment = "Top"></InkToolbar>
        <Button x:Name = "IMG_C3" Canvas.ZIndex = "8" Content = "Close" Background = "White"  VerticalAlignment = "Top" HorizontalAlignment = "Left" Click = "IMG_C3_Click"/>
        <Button x:Name = "Img_draw3" Canvas.ZIndex = "8" VerticalAlignment = "Top" HorizontalAlignment = "Right" Content = "Draw" Click = "Img_draw3_Click"/>
    </Grid>

 private TranslateTransform dragTranslation_I;


    public MainPage()
    {
        this.InitializeComponent();

        dragTranslation_I = new TranslateTransform();

    }

 private void img_grid3_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        dragTranslation_I.X += e.Delta.Translation.X;
        dragTranslation_I.Y += e.Delta.Translation.Y;
    }

ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ ㅡ

А это мой всплывающий код

<Popup x:Name = "IMG_G"    Width = "600" Height = "300" ManipulationMode = "All" HorizontalAlignment = "Left" >            
        <Grid x:Name = "img_grid" Width = "600" Height = "500">                
            <Image Canvas.ZIndex = "6" VerticalAlignment = "Top" HorizontalAlignment = "Left" x:Name = "img" Stretch = "Fill" Height = "400" Width = "600" />
            <InkCanvas x:Name = "img_inkcanvas"/>
            <InkToolbar x:Name = "img_inktoolbar" Canvas.ZIndex = "8" TargetInkCanvas = "{x:Bind img_inkcanvas}" VerticalAlignment = "Top"></InkToolbar>
            <Button x:Name = "IMG_C" Canvas.ZIndex = "8" Content = "Close" Background = "White"  VerticalAlignment = "Top" HorizontalAlignment = "Left" Click = "IMG_C_Click" />
            <Button x:Name = "Img_draw" Canvas.ZIndex = "8" VerticalAlignment = "Top" HorizontalAlignment = "Right" Click = "Img_draw_Click" Content = "Draw"/>
        </Grid>
    </Popup>

Нельзя ли рисовать на изображении с помощью всплывающего пользовательского интерфейса?

ИЛИ Я не могу переместить изображение моей сетки?

Это невозможно ?? Мне действительно интересно

Пожалуйста, расскажите мне все, что знаете !!

Спасибо

Применение градиента к изображению с помощью CSS
Применение градиента к изображению с помощью CSS
Здравствуйте, братья и сестры, как дела? Недавно я застрял на применении градиента к изображению. Я применял это много раз, но иногда наши требования...
Получение URL-адреса изображения курса в Moodle с помощью PHP
Получение URL-адреса изображения курса в Moodle с помощью PHP
Moodle - это популярная система управления обучением с открытым исходным кодом, используемая многими учебными заведениями и организациями по всему...
0
0
667
1

Ответы 1

Когда вы используете панель Холст и используете присоединенное свойство Canvas.ZIndex для помещения элементов управления в xaml, элемент с наивысшим значением Canvas.ZIndex отрисовывается последним и, следовательно, отрисовывается поверх любых других элементов, которые имеют то же пространство или перекрываются каким-либо образом. Таким образом, самый высокий zindex перекрывает более низкие элементы управления. Если верхний из них имеет не максимальное значение альфа, вы можете увидеть нижние элементы управления zindex, вы также должны указать размер элементов управления, поскольку Canvas не изменяет размер своих дочерних элементов.

Если вы создадите правильный макет, вы можете рисовать на изображении с помощью всплывающего пользовательского интерфейса. Вот образец для рисования во всплывающем окне:

Xaml:

 <Button Click = "ShowPopup" Content = "click me"/>
 <Popup x:Name = "IMG_G"  Width = "600" Height = "300" ManipulationMode = "All" HorizontalAlignment = "Left" >
     <Grid x:Name = "img_grid" Width = "600" Height = "500">
         <Image  VerticalAlignment = "Top" Source = "Assets/image1.jpg" HorizontalAlignment = "Left"
                 x:Name = "img" Stretch = "Fill" Height = "400" Width = "600" />
         <InkCanvas   x:Name = "img_inkcanvas"/>
         <InkToolbar   x:Name = "img_inktoolbar" TargetInkCanvas = "{x:Bind img_inkcanvas}" 
                       VerticalAlignment = "Top"></InkToolbar>
         <Button  x:Name = "IMG_C"  Content = "Close" VerticalAlignment = "Top" HorizontalAlignment = "Left" />
         <Button  x:Name = "Img_draw" VerticalAlignment = "Top" HorizontalAlignment = "Right" Content = "Draw"/>
     </Grid>
 </Popup>

Код позади:

public InkCanvasPage()
{
    this.InitializeComponent();
    img_inkcanvas.InkPresenter.InputDeviceTypes = 
Windows.UI.Core.CoreInputDeviceTypes.Mouse |
Windows.UI.Core.CoreInputDeviceTypes.Pen;
}
private void ShowPopup(object sender, RoutedEventArgs e)
{
    IMG_G.IsOpen = true;
}

Обратите внимание, что: по умолчанию InkCanvas не поддерживает ввод рукописного ввода с других устройств, кроме пера. Вы должны указать поддержку других устройств через InputDeviceTypes объекта InkPresenter.

Что касается вашего второго вопроса о перемещении изображения, поскольку вы наложили InkCanvas поверх всего изображения, изображение не может получить событие ManipulationDelta. Вы можете попытаться избежать перекрытия какой-либо области изображения, чтобы управлять изображением из этой области. В следующем примере вы можете переместить изображение с верхних 20 пикселей изображения.

Xaml:

<Grid x:Name = "img_grid" Width = "600" Height = "500">
    <Image  VerticalAlignment = "Top" Source = "Assets/image1.jpg" HorizontalAlignment = "Left"
                x:Name = "img" Stretch = "Fill" Height = "400" Width = "600" ManipulationMode = "All" />
    <InkCanvas Margin = "0,20,0,0"  x:Name = "img_inkcanvas"/>
    <InkToolbar Margin = "0,20,0,0"  x:Name = "img_inktoolbar" TargetInkCanvas = "{x:Bind img_inkcanvas}"
                      VerticalAlignment = "Top"></InkToolbar>
    <Button  x:Name = "IMG_C"  Content = "Close" VerticalAlignment = "Top" HorizontalAlignment = "Left" />
    <Button  x:Name = "Img_draw" VerticalAlignment = "Top" HorizontalAlignment = "Right" Content = "Draw"/>
</Grid>

Код позади:

public InkCanvasPage()
{
    this.InitializeComponent();
    img_inkcanvas.InkPresenter.InputDeviceTypes =
Windows.UI.Core.CoreInputDeviceTypes.Mouse |
Windows.UI.Core.CoreInputDeviceTypes.Pen;
    img.ManipulationDelta += Img_ManipulationDelta;
    dragTranslation = new TranslateTransform();
    // Apply the translation to the Rectangle.
    img.RenderTransform = this.dragTranslation;
}

private void Img_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
    dragTranslation.X += e.Delta.Translation.X;
    dragTranslation.Y += e.Delta.Translation.Y;
}

private TranslateTransform dragTranslation;

Извините, я неправильно понял. Ваше предложение отлично работает!

Kay 27.07.2018 04:17

Да, это ключевой момент вашей проблемы. Самое высокое значение Canvas.ZIndex отрисовывается последним и, следовательно, отрисовывается поверх любых других элементов, которые имеют то же пространство или перекрываются каким-либо образом.

Breeze Liu - MSFT 27.07.2018 04:38

Другие вопросы по теме