Нарисуйте линию и переместите ее программно

Я хочу нарисовать линию в сетке 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, и у этого графического интерфейса есть знак вставки. линии должны быть похожи на перекрестие (и помогают увидеть, где на самом деле находится курсор)


person Pippl    schedule 14.03.2012    source источник
comment
Извините, я ошибочно подумал, что вы говорите о WPF DataGrid.   -  person Flot2011    schedule 14.03.2012
comment
Попробуйте прокомментировать //testline.Stretch = Stretch.Fill;   -  person Klaus78    schedule 14.03.2012
comment
Спасибо, теперь все будет хорошо! Вы знаете, почему это не работает с Stretch?   -  person Pippl    schedule 14.03.2012
comment
вы можете посмотреть msdn.microsoft.com/en-us/ библиотека/ -> Растягиваемые фигуры   -  person Klaus78    schedule 14.03.2012
comment
вы уверены, что не собирались помещать эту строку на холст? Затем вы можете настроить координаты холста и переместить линию таким образом.   -  person Brannon    schedule 16.03.2012
comment
на самом деле он работает, так что, возможно, в будущем я протестирую его с холстом (но я думаю, что это будет сложнее, чем фактическое решение)   -  person Pippl    schedule 16.03.2012
comment
В качестве примечания: я бы не стал создавать элементы пользовательского интерфейса в коде, так как стилизация была бы сложной. Вместо этого я бы создал объект в XAML и ссылался на него в коде.   -  person Vitalij    schedule 26.03.2012


Ответы (2)


Во-первых, я бы не стал манипулировать координатами, поскольку они в первую очередь предназначены для определения формы линии. Во-вторых, я бы не использовал 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 — отличный инструмент для этого), а затем использовать ссылку на них из кода позади.

person Vitalij    schedule 26.03.2012

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

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

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

person Community    schedule 26.03.2012