wpf - 将任何旧的 WPF 几何转换为 PathFigureCollection?
问题描述
我有一系列与形状相关的视图模型类。您的典型传统层次结构:基本 ShapeVm 类,然后是 LineVm、CircleVm 等。每个都公开适当类型的 Geometry 属性。
public abstract class ShapeVm
{
public abstract Geometry Geometry { get; }
}
public class LineVm : ShapeVm
{
public override Geometry Geometry => new LineGeometry(P1, P2);
public Point P1 { get; set; }
public Point P2 { get; set; }
}
到目前为止,我已经使用相同的类型 Path 在 XAML 中公开了这些,而不管形状类型如何。
<Path Fill="Yellow" StrokeThickness="3" Data={Binding Geometry}"/>
但现在我希望能够对 XAML 中的每个 PathGeometry 应用转换。这给我带来了“让我的代码闻起来”性质的问题:
我的方法是在 XAML 中手动构造我的 Path 对象的 PathGeometry 并设置它的 Transform 属性。但我无法弄清楚如何干净地将所有各种几何类型(LineGeometry、EllipseGeometry 等)轻松转换为 PathGeometry。我需要为 PathGeometry 提供“数字”属性。
<Path Fill="Yellow" Stroke="Blue" StrokeThickness="3">
<Path.Data>
<PathGeometry Figures="???" **** WHAT DO I USE HERE??? ***
Transform="{Binding MyViewGeoTransform}"/>
</Path.Data>
</Path>
PathGeometry.Figures 属性是 PathFigureCollection 类型。是否有内置转换器可以将任何旧的 WPF 几何转换为 PathFigureCollection?System.Windows.Media.GeometryConverter 似乎无法解决问题。
是否有一些我想念的明显简单的方法来做到这一点?我应该只写我的转换器吗?
(我意识到我可以为每种形状类型编写一个不同的数据模板,如果它最干净,但在 XAML 中仅使用一个 Path 对象会吸引我的简单感)
解决方案
将 Transform 应用于 Path 的最简单方法可能是设置其RenderTransform
属性:
<Path Fill="Yellow" StrokeThickness="3"
Data="{Binding Geometry}"
RenderTransformOrigin="0.5,0.5"
RenderTransform="{Binding MyViewGeoTransform}"/>
如果出于任何原因不希望这样做,您可以将 MultiBinding 与创建转换后的 GeometryGroup 的转换器一起使用:
<Path Fill="Yellow" StrokeThickness="3">
<Path.Data>
<MultiBinding Converter="{StaticResource TransformedGeometryConverter}">
<Binding Path="Geometry"/>
<Binding Path="MyViewGeoTransform"/>
</MultiBinding>
</Path.Data>
</Path>
转换器:
public class TransformedGeometryConverter : IMultiValueConverter
{
public object Convert(
object[] values, Type targetType, object parameter, CultureInfo culture)
{
var geometry = new GeometryGroup { Transform = (Transform)values[1] };
geometry.Children.Add((Geometry)values[0]);
return geometry;
}
public object[] ConvertBack(
object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
推荐阅读
- python - 如何在函数之间传递参数?
- aspose - 如何让 Aspose.Cells 19.10 在 Linux .Net 服务中正确渲染字体?
- r - R粘贴列表绑定
- netbeans - JFreeChart 不能处理可执行的 JAR 文件?
- html - CSS 选择器 QuerySelector 替代
- node.js - 使用 BATCH 文件在受密码保护的文件夹中调用 NodeJS 脚本
- python - 从字符串中提取数组
- xaml - Xamarin 表单用户界面不会更新以反映 Android 上的 XAML 更改
- wordpress - woocommerce 订单在数据库中,但不在仪表板中,不在订单导出中
- python - 正则表达式 - 仅在数字之后和括号之前获取字符串(例如 1.Manhattan (NY))