Во-первых, я бы не стал манипулировать координатами, поскольку они в первую очередь предназначены для определения формы линии.
Во-вторых, я бы не использовал Canvas, а использовал бы Render Transformation, поскольку он потенциально работает на GPU, а не на CPU, что делает анимацию более плавной.
Итак, я бы сделал что-то вроде этого:
XAML:
<Grid x:Name="LayoutRoot">
<Line x:Name="crosshair"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Stroke="Red"
X1="0"
X2="0"
Y1="10"
Y2="0" />
<Button Width="50"
Height="50"
HorizontalAlignment="Right"
Click="MoveRight"
Content=">" />
</Grid>
Код сзади:
public partial class MainWindow : Window
{
private int moveRightDist = 0;
public MainWindow()
{
InitializeComponent();
}
private void MoveRight(object sender, RoutedEventArgs e)
{
this.moveRightDist++;
crosshair.RenderTransform = new TranslateTransform(this.moveRightDist, 0);
}
}
<Grid x:Name="LayoutRoot">
<Line x:Name="crosshair"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Stroke="Red"
X1="0"
X2="0"
Y1="10"
Y2="0" />
<Button Width="50"
Height="50"
HorizontalAlignment="Right"
Click="MoveRight"
Content=">" />
</Grid>
Важно! Если вы определите матрицу аффинного преобразования в XAML и анимируете ее, в какой-то момент WPF заменит экземпляр этой матрицы, и если вы ссылаетесь на эту матрицу в своем коде, вы не сможете манипулировать объектом.
Примечание. Я бы лучше создал все элементы пользовательского интерфейса в XAML (Blend - отличный инструмент для этого), а затем использовал бы ссылку на них из кода.