Uwp 为CompositionClip使用复杂路径

Uwp 为CompositionClip使用复杂路径,uwp,c++-winrt,winui,windows-composition-api,direct-composition,Uwp,C++ Winrt,Winui,Windows Composition Api,Direct Composition,UWP/WinUI中的Visuals可以对其应用a,这是的实例。CompositionClip的一种类型是a,它可以具有从类派生的多种类型。我正在寻找一个具有圆形矩形形状但具有不同椭圆角半径的剪辑,如下所示 这将非常适合于,但该类有一个限制,即它支持在所有四个角上具有相同的椭圆半径,不允许不同的半径。这样就剩下了由实例定义的。这就是我走到死胡同的地方 此CompositionPath实现接口。我想不出如何使用这个igometrysource2d接口来构建一个包含直线和曲线的复杂路径。在线搜索导

UWP/WinUI中的Visuals可以对其应用a,这是的实例。
CompositionClip
的一种类型是a,它可以具有从类派生的多种类型。我正在寻找一个具有圆形矩形形状但具有不同椭圆角半径的剪辑,如下所示

这将非常适合于,但该类有一个限制,即它支持在所有四个角上具有相同的椭圆半径,不允许不同的半径。这样就剩下了由实例定义的。这就是我走到死胡同的地方

CompositionPath
实现接口。我想不出如何使用这个
igometrysource2d
接口来构建一个包含直线和曲线的复杂路径。在线搜索导致使用该接口的文章太多,而使用的是从 Windows社区工具包< />代码生成的类,如果我理解正确,只针对GITHUB页面,就意味着<代码> C</Cuth>项目,因为我需要C++中的一些东西。 因此,问题是:

  • 我们如何使用
    IGeometrySource2D
    CompositionPath
    创建复杂形状?如果不可行,那么
  • 对于
    C++/WinRT
    语言投影,是否有任何与之等价的
    CanvasPathGeometry
另外,我知道WinUI 3提供的(根据答案)适用于我的案例,但在UWP中不可用,因此这对我来说不是一个可行的解决方案

编辑:

根据评论中共享的建议/指针,这里尝试使用NuGet包

auto visual = _compositor->CreateSpriteVisual();
visual->Size = float2(500.0f);
visual->Offset = float3(50, 50, 0);
visual->Brush = _compositor->CreateColorBrush(Colors::Red);

auto canvasPathBuilder = ref new CanvasPathBuilder(ref new CanvasDevice());
canvasPathBuilder->BeginFigure(radius.topLeft.x, 0);
canvasPathBuilder->AddLine(visual->Size.x - radius.topRight.x, 0);
canvasPathBuilder->AddArc(float2(visual->Size.x , radius.topRight.y ), radius.topRight.x, radius.topRight.y,
    0, CanvasSweepDirection::Clockwise, CanvasArcSize::Small);
canvasPathBuilder->AddLine(visual->Size.x, visual->Size.y - radius.bottomRight.y);
canvasPathBuilder->AddArc(float2(visual->Size.x - radius.bottomRight.x, visual->Size.y), radius.bottomRight.x, radius.bottomRight.y,
    0, CanvasSweepDirection::Clockwise, CanvasArcSize::Small);
canvasPathBuilder->AddLine(radius.bottomLeft.x, visual->Size.y);
canvasPathBuilder->AddArc(float2(0, visual->Size.y - radius.bottomLeft.y), radius.bottomLeft.x, radius.bottomLeft.y,
    0, CanvasSweepDirection::Clockwise, CanvasArcSize::Small);
canvasPathBuilder->AddLine(0, radius.topLeft.y);
canvasPathBuilder->AddArc(float2(radius.topLeft.x, 0), radius.topLeft.x, radius.topLeft.y,
     0, CanvasSweepDirection::Clockwise, CanvasArcSize::Small);
canvasPathBuilder->EndFigure(CanvasFigureLoop::Closed);

auto canvasGeometry = CanvasGeometry::CreatePath(canvasPathBuilder);
auto compositionPath = ref new CompositionPath(canvasGeometry);
auto pathGeometry = _compositor->CreatePathGeometry();
pathGeometry->Path = compositionPath;
visual->Clip = _compositor->CreateGeometricClip(pathGeometry);
这似乎有效


现在,,下一步是删除
CanvasPath
等的
Win2D
依赖项,并使用
ID2D1Geometry
和其他接口提供
IGeomterySource2D
,因为我不希望将NuGet包作为项目依赖项。

从对象创建一个
CompositionPath
它同时实现了
igometrysource2d
igometrysource2dinterop
IgometrySource2dInterop.GetGeometry
要求使用可使用“常规”C/C++实现的Direct2D几何体(
ID2D1Geometry
)。在大多数示例中,您会发现这是使用Win2D完成的(这是只为UWP保留的,这是一个愚蠢的设计决策)。正如您所提到的,也许您可以通过CanvasPathGeometry来完成,您可以通过组合这些方法来绘制这样的形状,例如AddSrc()和AddLine()方法。我们正在就您的问题咨询其他工程师,可能会有一些延迟。@SimonMourier您能告诉我有关
IgometrySource2dInterop
的参考/文档吗?我找不到任何东西,除了很少有提到这个界面的问题。这是新的微软,全是开源的,但没有全部的文档。定义位于Windows SDK中的C:\Program Files(x86)\Windows Kits\10\Include\10.0.19041.0\winrt\Windows.graphics.interop.h,您可以在Win2D中找到参考: