C# 如何在其上对齐Canva子对象';从中间到特定坐标是多少?

C# 如何在其上对齐Canva子对象';从中间到特定坐标是多少?,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我从我的ViewModel收到一些坐标,我需要WPF画布的一个子项,其中心位于这些坐标上 我怎样才能做到这一点?我尝试了几种渲染转换,但无法达到预期效果 <Canvas> <SomeControl Canvas.Left="{Binding ToolBarHorizontalPosition}" Canvas.Top="{Binding ToolBarVerticalPosition}"/> </Canvas>

我从我的ViewModel收到一些坐标,我需要WPF画布的一个子项,其中心位于这些坐标上

我怎样才能做到这一点?我尝试了几种渲染转换,但无法达到预期效果

<Canvas>
   <SomeControl Canvas.Left="{Binding ToolBarHorizontalPosition}" Canvas.Top="{Binding ToolBarVerticalPosition}"/>
</Canvas>



public MyViewModel: INotifyPropertyChanged{
   public double ToolBarHorizontalPosition {get;set;}
   public double ToolBarVerticalPosition{get;set;}

   public void SomeUpdater(){
      ToolBarHorizontalPosition  = ...;
      ToolBarVerticalPosition= ...;
      // Raise property changed
   }
}

公共MyViewModel:INotifyPropertyChanged{
公共双工具栏水平位置{get;set;}
公共双工具栏垂直位置{get;set;}
public-void-SomeUpdater(){
工具栏水平位置=。。。;
工具栏垂直位置=。。。;
//提升属性已更改
}
}
问题是控件将具有动态大小(其内容将增长),因此我无法直接计算工具栏位置以引用左/右(因为我不知道宽度)


有没有办法在XAML中实现这一点?

事实上,我刚刚找到了一个解决方案,使用一个转换器,可以从ViewModel和
实际宽度中获取位置:

public class CenterValueConverter : IMultiValueConverter
{
    public object Convert(object[] values,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        if (values == null || values.Length != 2)
        {
            return null;
        }

        double originalPosition = (double)values[0];
        double size = (double)values[1];
        return originalPosition - (size / 2);
    }

    public object[] ConvertBack(object value,
        Type[] targetTypes,
        object parameter,
        CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}
然后在X轴中心的XAML中:

<Canvas>
   <SomeControl Name="SomeControl" Canvas.Top="{Binding ToolBarVerticalPosition}">
      <Canvas.Left>
         <MultiBinding Converter="{StaticResource CenterValuerConverter}">
            <Binding Path="ToolBarHorizontalPosition"/>
            <Binding ElementName="SomeControl" Path="ActualWidth"/>
         </MultiBinding>
      </Canvas.Left>
   </SomeControl>
</Canvas>