Нарисуйте линию и переместите ее программно - PullRequest
7 голосов
/ 14 марта 2012

Я хочу нарисовать линию на сетке WPF.

private void InitializeTestline()
{
    testline = new Line();
    grid.Children.Add(testline);
    testline.X1 = 0;
    testline.X2 = 1;
    testline.Y1 = 0;
    testline.Y2 = 1;
    testline.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
    testline.VerticalAlignment = System.Windows.VerticalAlignment.Top;
    testline.Stroke = Brushes.Red;
    testline.Stretch = Stretch.Fill;
    testline.StrokeThickness = 2;
    testline.Visibility = System.Windows.Visibility.Visible;
}

Рисуется без проблем. Но теперь я хочу добавить четыре кнопки в сетку (вверх, вниз, влево, вправо). Поэтому, когда я нажимаю одну из кнопок, линия должна двигаться в выбранном мной направлении.

private void MoveUp_Click(object sender, RoutedEventArgs e)
{
    this.testline.Y1 += move;
    this.testline.Y2 += move;
}

Это была функция, которую я хочу использовать для этого, но она не работает. Так как же можно переместить эту строку?

В конце концов, у меня есть графический интерфейс, похожий на старый терминал 3270, и этот графический интерфейс имеет каретку. линии должны быть похожи на перекрестие (и помогают увидеть, где на самом деле находится каретка)

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Во-первых, я бы не стал манипулировать координатами, поскольку они в первую очередь предназначены для определения формы линии. Во-вторых, я бы не использовал 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="&gt;" />
</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="&gt;" />
</Grid>

Важно! Если вы определите матрицу аффинного преобразования в XAML и анимируете ее, в какой-то момент WPF заменит экземпляр этой матрицы, и если вы ссылаетесь на эту матрицу в своем коде, вы не сможете манипулировать объектом.

Примечание. Я бы лучше создал все элементы пользовательского интерфейса в XAML (Blend - отличный инструмент для этого), а затем использовал бы ссылку на них из кода.

0 голосов
/ 26 марта 2012

Я делал ту же самую основную вещь только в лабиринте, и это то, что я хотел бы сделать

private void Move_Up Click(object sender, RoutedEventArgs e)
{
  Point testlinelocation;
  testlinelocation = testline.Y1;
  testlinelocation.Offset(someX, someY);
  testlinelocation = testline.Y1;
}

Это должно сработать, это сработало для меня, удачи Это в winforms

...