C# 通过添加一些值绑定到Canvas.TopProperty

C# 通过添加一些值绑定到Canvas.TopProperty,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,我有以下代码: <Rectangle x:Name="cage" Height="247" Canvas.Left="278" Canvas.Top="220" Width="450"> <Rectangle.Fill> <ImageBrush Stretch="None" ImageSource="resources/cage.gif"/> </Rectangle.Fill> <

我有以下代码:

<Rectangle x:Name="cage" Height="247" Canvas.Left="278" Canvas.Top="220" Width="450">
        <Rectangle.Fill>
            <ImageBrush Stretch="None" ImageSource="resources/cage.gif"/>
        </Rectangle.Fill>
    </Rectangle>



绑定正在工作,但我希望保持此元素相对彼此的位置。换句话说,如果我移动框架,标签的topProperty将变为“移位值+285”。如何做到这一点?

考虑按照bit的建议使用转换器

一个简单的例子如下所示:

XAML

<UserControl.Resources>
    <converterNamespace:LabelOffsetConverter x:Key="labelOffsetConverter"/>
</UserControl.Resources>

<Label x:Name="to1" Content="1" Canvas.Left="550" 
       Canvas.Top="{Binding Source=cage, Path=Canvas.Top, Mode=OneWay,
                    Converter={StaticResource labelOffsetConverter}"
       BorderBrush="#FF272727" 
       BorderThickness="1" 
       Height="38" Width="38" 
       HorizontalContentAlignment="Center" 
       VerticalContentAlignment="Center" 
       FontSize="20" PreviewMouseDown="to1_PreviewMouseDown"/>
通过这种方式解决: C#
使用转换器。请看:谢谢,我将尝试这种方式。我建议你确实阅读作为对你的问题的评论的那篇文章。在处理此问题之前,您应该了解转换器的基本知识。
<UserControl.Resources>
    <converterNamespace:LabelOffsetConverter x:Key="labelOffsetConverter"/>
</UserControl.Resources>

<Label x:Name="to1" Content="1" Canvas.Left="550" 
       Canvas.Top="{Binding Source=cage, Path=Canvas.Top, Mode=OneWay,
                    Converter={StaticResource labelOffsetConverter}"
       BorderBrush="#FF272727" 
       BorderThickness="1" 
       Height="38" Width="38" 
       HorizontalContentAlignment="Center" 
       VerticalContentAlignment="Center" 
       FontSize="20" PreviewMouseDown="to1_PreviewMouseDown"/>
public class LabelOffsetConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (!(value is double))
            return DependencyProperty.UnsetValue;

        double doubleValue = (double)value;
        return doubleValue + 285;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // No need to implement, since the binding is in one way mode.
        throw new NotImplementedException();
    }
}
public class Label1offset : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (!(value is double)) return DependencyProperty.UnsetValue;

        double doubleValue = (double)value;
        return doubleValue + 65.0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // No need to implement, since the binding is in one way mode.
        throw new NotImplementedException();
    }
}
Binding binding1 = new Binding();
            binding1.Converter = new Label1offset();
            binding1.Source = cage;
            binding1.Path = new PropertyPath(Canvas.TopProperty);
            binding1.Mode = BindingMode.OneWay;
            to1.SetBinding(Canvas.TopProperty, binding1);