【问题标题】:How to align a Canva child on it's middle to specific coordinates?如何将 Canva 子对象的中间对齐到特定坐标?
【发布时间】:2021-04-16 08:25:38
【问题描述】:

我从我的 ViewModel 收到一些坐标,我需要有一个 WPF Canvas 的子节点,其中心位于这些坐标上。

我怎样才能做到这一点?我尝试了几种 RenderTransform,但都无法达到预期的效果。

<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
   }
}

问题是控件将具有动态大小(它的内容会增长),所以我不能直接计算工具栏位置来引用左/右(因为我不知道宽度)。

有没有办法在 XAML 中做到这一点?

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

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

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

    然后在我的 XAML 中以 X 轴为中心:

    <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多