为什么在 CanvasRenderTarget 中绘制的重叠矩形在 win2d 中可见?
why the overlap rectangle drawn in CanvasRenderTarget were visible in win2d?
我试过的是?
我的 XAML 代码:
<Canvas x:Name="can">
</Canvas>
我的 C# 代码:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
CanvasVirtualControl canvasVirtual = new CanvasVirtualControl();
canvasVirtual.Width = 1500;
canvasVirtual.Height = 800;
canvasVirtual.RegionsInvalidated += CanvasVirtual_RegionsInvalidated;
//canvasVirtual.Invalidate();
can.Children.Add(canvasVirtual);
}
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;
using (session1 = mouseOverOffscreen.CreateDrawingSession())
{
session1.DrawRectangle(new Rect(0, 0, 300, 300), 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.DrawRectangle(new Rect(0, 0, 300, 300), 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);
}
}
我正在尝试在 canvasVirtualControl 中绘制两个相交的矩形,使用 canvasRenderTarget.The 矩形图像由 canvasRenderTarget.This 创建,两个图像在屏幕外绘制,此屏幕外稍后用于在 CanvasVirtualControl 中绘制.
我的问题是,在绘制两个相交的矩形(即重叠)时,结果将是这样的。
我需要擦除重叠的矩形区域,我该怎么做?例如,如下图,
这里涉及到Win2D中路径的计算。 CanvasGeometryWin2D中提供了图形的组合计算,可以满足您的需求:
我们需要创建两个 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);
}
}
渲染结果将显示为消除内部相交边界的重叠矩形(效果与您在图层中的预期效果略有不同)。
我试过的是? 我的 XAML 代码:
<Canvas x:Name="can">
</Canvas>
我的 C# 代码:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
CanvasVirtualControl canvasVirtual = new CanvasVirtualControl();
canvasVirtual.Width = 1500;
canvasVirtual.Height = 800;
canvasVirtual.RegionsInvalidated += CanvasVirtual_RegionsInvalidated;
//canvasVirtual.Invalidate();
can.Children.Add(canvasVirtual);
}
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;
using (session1 = mouseOverOffscreen.CreateDrawingSession())
{
session1.DrawRectangle(new Rect(0, 0, 300, 300), 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.DrawRectangle(new Rect(0, 0, 300, 300), 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);
}
}
我正在尝试在 canvasVirtualControl 中绘制两个相交的矩形,使用 canvasRenderTarget.The 矩形图像由 canvasRenderTarget.This 创建,两个图像在屏幕外绘制,此屏幕外稍后用于在 CanvasVirtualControl 中绘制.
我的问题是,在绘制两个相交的矩形(即重叠)时,结果将是这样的。
我需要擦除重叠的矩形区域,我该怎么做?例如,如下图,
这里涉及到Win2D中路径的计算。 CanvasGeometryWin2D中提供了图形的组合计算,可以满足您的需求:
我们需要创建两个 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);
}
}
渲染结果将显示为消除内部相交边界的重叠矩形(效果与您在图层中的预期效果略有不同)。