如何解决为 CompositionClip
UWP/WinUI 中的Visual
可以应用 Clip
,它是 CompositionClip
的一个实例。 CompositionClip
的一种类型是 GeometricClip
,它可以具有从 Geometry
类派生的各种类型的 CompositionGeometry
。我正在寻找一个具有圆角矩形形状但具有不同椭圆角半径的剪辑,如下所示
这将非常适合 CompositionRoundedRectangleGeometry
,但该类有一个限制,即它支持在所有四个角上具有相同的椭圆半径,不允许不同的半径。因此,剩下的 CompositionPathGeometry
的 Path
由 CompositionPath
实例定义。这是我走到了死胡同的地方。
此 CompositionPath
实现 IGeometrySource2D
接口。我不知道如何使用这个 IGeometrySource2D
界面来构建一条包含直线和曲线的复杂路径。在线搜索导致了 this 文章,该文章也避免使用该界面,而是使用围绕 CanvasPathGeometry
构建的类,该类来自 Windows Community Toolkit
,如果我理解正确,仅适用于 {{1 }} 根据 this GitHub 页面创建的项目,但对我不起作用,因为我需要 C++ 中的内容。
所以问题是:
- 我们如何使用
C#
和IGeometrySource2D
创建复杂的形状?如果不可行,那么 - 对于
CompositionPath
语言投影是否有任何等效的CanvasPathGeometry
?
附言我知道 WinUI 3 提供了 RectangleClip
(根据 this 的答案),适用于我的情况,但在 UWP 中不可用,因此这对我来说不是一个可行的解决方案。
编辑:
根据评论中共享的建议/指针,尝试使用 Win2D.UWP
NuGet 包。
C++/WinRT
这似乎有效
现在,下一步是删除 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,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,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,CanvasArcSize::Small);
canvasPathBuilder->AddLine(0,radius.topLeft.y);
canvasPathBuilder->AddArc(float2(radius.topLeft.x,0),radius.topLeft.x,radius.topLeft.y,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);
等的 Win2D
依赖项,并使用 CanvasPath
和其他接口来提供 ID2D1Geometry
,因为我更喜欢 不将 NuGet 包作为项目依赖项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。