Закодированные строки WPF С# не распознают начало координат

Я изучаю графические возможности WPF+C#. Рисование линии с помощью XAML делает то, что ожидалось. Ok. Нарисовать простую линию кодом C# — это что-то «странное». Координаты отображаются не там, где должны быть. Почему? Следующий код должен реализовать диагональ от (0, 0) до (ширина, высота) панели контейнера строки.

private void buttonStart_Click(object sender, RoutedEventArgs e)
        {
            Line line1 = new Line
            {
                Stroke = Brushes.Black
            };

            Thickness thickness = new Thickness(10, -10, 36, 250);
            line1.Margin = thickness;
            line1.Visibility = Visibility.Visible;
            line1.StrokeThickness = 4;

            line1.X1 = 0;
            line1.Y1 = 0;
            line1.X2 = MainGrid.ActualWidth;
            line1.Y2 = MainGrid.ActualHeight;

            line1.HorizontalAlignment = HorizontalAlignment.Left;
            MainGrid.Children.Add(line1);
        }

Неважно, какую панель вы используете: холст, док-панель, сетку, стекпанель, я наблюдал одно и то же странное и раздражающее поведение. Диагональ не отображается. Не начинается в исходной вершине (0,0): (слева, сверху)


person Mik74    schedule 30.04.2020    source источник
comment
Если вы обеспокоены тем, что он попадает в верхний левый угол, похоже, что линия идет в угол окна (включая строку заголовка). А зачем там вместо пульта... понятия не имею.   -  person MikeH    schedule 01.05.2020
comment
Да, а как насчет (справа, внизу) координат (ActualWidth, ActualHeight)?   -  person Mik74    schedule 01.05.2020


Ответы (2)


Ваша проблема Thickness(10, -10, 36, 250). Это произвольное поле отсекает остальную часть строки. Вот упрощенная версия вашего кода, которая правильно рисует линию из левого верхнего угла в правый нижний:

private void buttonStart_Click(object sender, RoutedEventArgs e)
{
    Line line1 = new Line
    {
        Stroke = Brushes.Black,
        StrokeThickness = 4,
        X1 = 0,
        Y1 = 0,
        X2 = MainGrid.ActualWidth,
        Y2 = MainGrid.ActualHeight
    };

    MainGrid.Children.Add(line1);
}

Обратите внимание, что Visibility = Visibility.Visible оставлен, потому что Line (как и большинство других элементов) видимы по умолчанию.

person Keith Stein    schedule 01.05.2020
comment
Спасибо, и ответ с XAML, и ответ с C# делают диагональ правильной. Это очень важно для реализации систем координат. Я заметил, что с XAML изменение размера по диагонали производится автоматически, для строки с C # человеку необходимо реализовать привязку/обработчик событий, чтобы все было правильно. Во всяком случае, это работает! - person Mik74; 01.05.2020

Вы можете сделать это намного проще с помощью простого оператора пути — используйте Stretch="Fill", чтобы не беспокоиться о размерах.

<Path Stroke="Black" StrokeThickness="4" Data="M 0,0 L 1,1" Stretch="Fill" />
person Peregrine    schedule 01.05.2020