虽然 Thickness.X 和 Thickness.Y 不是依赖属性,但 Margin 是。您只需要定义一个接受包含 X 和 Y 值的对象的 ValueConverter,或者定义一个接受 X 和 Y 值的 MultiValueConvert。两种实现都会返回一个厚度。
<YourElement.Margin>
<MultiBinding Converter="{StaticResource myMarginConverter}">
<Binding Path="X"/>
<Binding Path="Y"/>
</MultiBinding>
</YourElement.Margin>
.
public class NameConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
//Validate parameters...
Thickness margin = new Margin(values[0], values[1], 0d, 0d);
return margin;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
//Validate parameters...
double x = ((Thickness)value).Left;
double y = ((Thickness)value).Top;
return new object[]{x, y};
}
}
我没有测试过这段代码,但你得到了图片。至于哪种方法更好,使用 Canvas 听起来更像是为您的预期目的设计的控件。但是,这取决于您要执行的操作的详细信息。我相信,如果您期望获得很多分数,canvas 具有提高虚拟化效率的潜力。如果它们不需要交互,您也可以将它们绘制到位图图像上。