Как в Win2D нарисовать прямоугольник с толщиной обводки? - PullRequest
1 голос
/ 19 июня 2020

Я знаю, как рисовать прямоугольник с толщиной обводки с помощью CanvasDrawingSession. Но проблема в том, что толщина обводки растет внутри и снаружи прямоугольника. Мне нужно, чтобы толщина обводки увеличивалась только внутри прямоугольника. Я не знаю. как этого добиться !! Что я пробовал?

Мой код xaml:

<Canvas x:Name="MyCanvas"> </Canvas>

Мой c# Код:

     private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        CanvasVirtualControl canvasVirtualControl = new CanvasVirtualControl();
        canvasVirtualControl.Width = 1486;
        canvasVirtualControl.Height = 610;
        MyCanvas.Children.Add(canvasVirtualControl);
        Canvas.SetLeft(canvasVirtualControl, 0);
        Canvas.SetTop(canvasVirtualControl, 100);
        canvasVirtualControl.RegionsInvalidated += CanvasVirtualControl_RegionsInvalidated;
    }

    private void CanvasVirtualControl_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
    {
        CanvasDrawingSession drawingSession;
        Rect rect = new Rect(args.InvalidatedRegions[0].Left, args.InvalidatedRegions[0].Top, args.InvalidatedRegions[0].Width, args.InvalidatedRegions[0].Height);

        using (drawingSession = sender.CreateDrawingSession(rect))
        {
            drawingSession.DrawRectangle(new Rect(0, 0, 200, 200), Windows.UI.Color.FromArgb(255, 255, 0, 0), 40);
        }
    }

enter image description here

Почему мой прямоугольник нарисован вот так? Я думаю, это из-за того, что толщина штриха растет внутри и снаружи прямоугольника. Как решить рисовать прямоугольник с толщиной штриха только внутри прямоугольника?

Обновленный вопрос:

при объявлении недействительным всей области CanvasVirtualControl толщина обводки увеличивается внутри и за пределами прямоугольника. Если я аннулирую конкретную область angular прямоугольника CanvasVirtualControl, толщина обводки увеличивается только внутри.

Мой код Xaml:

<Canvas x:Name="MyCanvas">
    <Button Content="InvalidateWholeRegion" Height="100" Canvas.Left="0" Canvas.Top="0" Click="InvalidateWholeRegion"/>
    <Button Content="InvalidateParticularRegion" Height="100" Canvas.Left="300" Canvas.Top="0" Click="InvalidateParticularRegion"/>
</Canvas>

Мой c# Код:

    CanvasVirtualControl canvasVirtualControl;
    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        canvasVirtualControl = new CanvasVirtualControl();
        canvasVirtualControl.Width = 1486;
        canvasVirtualControl.Height = 610;
        MyCanvas.Children.Add(canvasVirtualControl);
        Canvas.SetLeft(canvasVirtualControl, 0);
        Canvas.SetTop(canvasVirtualControl, 100);
        canvasVirtualControl.RegionsInvalidated += CanvasVirtualControl_RegionsInvalidated;
    }

    private void CanvasVirtualControl_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
    {
        CanvasDrawingSession drawingSession;
        Rect rect = new Rect(args.InvalidatedRegions[0].Left, args.InvalidatedRegions[0].Top, args.InvalidatedRegions[0].Width, args.InvalidatedRegions[0].Height);
        using (drawingSession = sender.CreateDrawingSession(rect))
        {
            drawingSession.DrawRectangle(new Rect(rect.X, rect.Y, 100, 100), Windows.UI.Color.FromArgb(255, 255, 0, 0), 40);
        }
    }

    private void InvalidateParticularRegion(object sender, RoutedEventArgs e)
    {
        canvasVirtualControl.Invalidate(new Rect(200, 200, 100, 100));
    }
    private void InvalidateWholeRegion(object sender, RoutedEventArgs e)
    {
        canvasVirtualControl.Invalidate(new Rect(0, 0, 1486, 610));
    }

Как рисовать strokeThickess растет снаружи также при аннулировании конкретной области?

1 Ответ

0 голосов
/ 19 июня 2020

Но проблема в том, что толщина обводки растет внутри и снаружи прямоугольника. Мне нужно, чтобы толщина обводки росла только внутри прямоугольника.

Путь рисования DrawRectangle Метод - центр штриха и это сделано специально. Когда вы устанавливаете Rect как 0, 0, 200, 200 , пакет будет обрезать половину верхней левой части. Таким образом, он нарисует прямоугольник, как указано выше.

Если мы хотим нарисовать полный прямоугольник, нам нужно убедиться, что начальная точка имеет разумное значение. Поэтому нам нужно изменить Rect как 20, 20, 200, 200 .

private void CanvasVirtualControl_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
{
    CanvasDrawingSession drawingSession;
    Rect rect = new Rect(args.InvalidatedRegions[0].Left, args.InvalidatedRegions[0].Top, args.InvalidatedRegions[0].Width, args.InvalidatedRegions[0].Height);

    using (drawingSession = sender.CreateDrawingSession(rect))
    {
        var dashedStroke = new CanvasStrokeStyle()
        {
            LineJoin = CanvasLineJoin.Round
        };
        drawingSession.DrawRectangle(new Rect(20, 20, 200, 200), Windows.UI.Color.FromArgb(255, 255, 0, 0),40,dashedStroke);
    }
}
...