将任何旧的 WPF 几何图形转换为 PathFigureCollection?



我有一系列与形状相关的视图模型类。 典型的传统层次结构:Base ShapeVm 类,然后是 LineVm、CircleVM 等。 每个都公开相应类型的几何属性。

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 属性。 但是我无法弄清楚如何干净地使所有各种几何类型(线几何,椭圆几何等)轻松转换为路径几何。 我需要为 PathGeometry 提供一个"Figures"属性。

<Path Fill="Yellow" Stroke="Blue" StrokeThickness="3">
<Path.Data>
<PathGeometry Figures="???" **** WHAT DO I USE HERE??? ***
Transform="{Binding MyViewGeoTransform}"/>
</Path.Data>
</Path>

属性的类型为 PathFigureCollection。 是否有内置转换器可以将任何旧的 WPF 几何图形转换为 PathFigureCollection? System.Windows.Media.GeometryConverter似乎没有做到这一点。

有没有一些明显的简单方法可以做到这一点,我错过了? 我应该只写我的转换器吗?

(我意识到我可以为每个形状类型编写一个不同的数据模板,如果它最干净,我会这样做,但在 XAML 中只使用一个 Path 对象会吸引我的简单感)

将转换应用于路径的最简单方法可能是设置其RenderTransform属性:

<Path Fill="Yellow" StrokeThickness="3"
Data="{Binding Geometry}"
RenderTransformOrigin="0.5,0.5"
RenderTransform="{Binding MyViewGeoTransform}"/>

如果出于任何原因不希望这样做,则可以将多重绑定与创建转换后的几何组的转换器一起使用:

<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();
}
}

相关内容

  • 没有找到相关文章

最新更新