Это включает в себя расчет путей в Win2D. CanvasGeometry предоставляется в Win2D для комбинированного расчета графики, что может удовлетворить ваши потребности:
Нам нужно создать два CanvasGeometry
как два прямоугольника:
var Rect1 = CanvasGeometry.CreateRectangle(sender, 100, 100, 300, 300);
var Rect2 = CanvasGeometry.CreateRectangle(sender, 0, 0, 300, 300);
С помощью метода CanvasGeometry.CombineWith
мы можем вычислить объединенную площадь:
var combineGeo = Rect2.CombineWith(Rect1, Matrix3x2.CreateTranslation(Vector2.Zero), CanvasGeometryCombine.Union);
Следующий шаг - нарисовать:
private void CanvasVirtual_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
{
CanvasRenderTarget Offscreen = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), (float)args.InvalidatedRegions[0].Width, (float)args.InvalidatedRegions[0].Height, 96);
using (CanvasDrawingSession session = Offscreen.CreateDrawingSession())
{
CanvasRenderTarget mouseOverOffscreen = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), 300, 300, 96);
CanvasDrawingSession session1;
var Rect1 = CanvasGeometry.CreateRectangle(sender, 100, 100, 300, 300);
var Rect2 = CanvasGeometry.CreateRectangle(sender, 0, 0, 300, 300);
var combineGeo = Rect2.CombineWith(Rect1, Matrix3x2.CreateTranslation(Vector2.Zero), CanvasGeometryCombine.Union);
using (session1 = mouseOverOffscreen.CreateDrawingSession())
{
session1.DrawGeometry(combineGeo, new Color { A = 255, R = 0, G = 255, B = 0 }, 2);
}
session.DrawImage(mouseOverOffscreen, new Rect(100, 100, 300, 300));
CanvasRenderTarget seleOverOffscreen = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), 300, 300, 96);
CanvasDrawingSession session2;
using (session2 = seleOverOffscreen.CreateDrawingSession())
{
session2.DrawGeometry(Rect2, new Color { A = 255, R = 255, G = 0, B = 0 }, 2);
}
session.DrawImage(seleOverOffscreen, new Rect(200, 200, 300, 300));
}
using (CanvasDrawingSession session = sender.CreateDrawingSession(new Rect((float)args.InvalidatedRegions[0].X, (float)args.InvalidatedRegions[0].Y, (float)args.InvalidatedRegions[0].Width, (float)args.InvalidatedRegions[0].Height)))
{
session.DrawImage(Offscreen);
}
}
Результат визуализации будет отображаться в виде перекрывающихся прямоугольников, которые удалите внутренние пересекающиеся границы (эффект немного отличается от ожидаемого эффекта в слое).