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

Хорошо, короче говоря, родительская сетка адаптируется пропорционально так введите описание изображения здесь

Затем в подпрограмму я добавляю следующий код:

public void RadialPercentage(Grid grd )
{
    Ellipse elpExt = new Ellipse();
    elpExt.Stroke = Brushes.Green;
    elpExt.StrokeThickness = 4;
    //elpExt.Margin = new Thickness(0);
    //elpExt.HorizontalAlignment = HorizontalAlignment.Center;
    elpExt.VerticalAlignment = VerticalAlignment.Stretch;
    grd.Children.Add(elpExt);

    Ellipse elpInt = new Ellipse();
    elpInt.Stroke = Brushes.Blue;
    elpInt.StrokeThickness = 4;
    elpInt.Margin = new Thickness(20);
    //elpInt.Width = elpInt.Height = dim-20;
    //elpInt.HorizontalAlignment = HorizontalAlignment.Center;
    elpInt.VerticalAlignment = VerticalAlignment.Stretch;
    grd.Children.Add(elpInt);
    return;
}

Но эффект следующий:

enter image description here

Поэтому он растягивается как по вертикали, так и по горизонтали, даже если я поставлю только вертикальное, а не горизонтальное ограничение. Если я установлю его по центру, эллипс разрушится.

Чтобы решить проблему, даже я не уверен, что это правильно, я попытался взглянуть на вес / высоту родительской сетки, но очевидно, что и эти значения, и фактические значения установлены на ноль.

Спасибо за помощь Патрику

0
Patrick 28 Май 2017 в 15:54

2 ответа

Лучший ответ

Как насчет установки привязки Width к ActualHeight эллипса и установки HorizontalAlignment в Center? Что-то вроде этого:

var ellipse = new Ellipse();

var binding = new Binding(Ellipse.ActualHeightProperty.Name)
{
    RelativeSource = new RelativeSource(RelativeSourceMode.Self),
    Mode = BindingMode.OneWay
};

ellipse.VerticalAlignment = VerticalAlignment.Stretch;
ellipse.HorizontalAlignment = HorizontalAlignment.Center;

BindingOperations.SetBinding(ellipse, Ellipse.WidthProperty, binding);
3
Maxim 28 Май 2017 в 13:07

Вы можете обновлять размер вашего Ellipse каждый раз, когда размер родительского Grid изменяется.

Вы должны добавить в свой Grid SizeChanged Event. Пример XAML:

<Grid Name        = "MyGrid"
      SizeChanged = "MyGridSizeChanged">
  <!-- rows and columns definitions -->
  <Ellipse Name        = "MyEllipse"
           Grid.Row    = "i"
           Grid.Column = "j" />
</Grid>

Теперь при каждом изменении размера Grid функция MyGridSizeChanged будет выполняться. Вы должны добавить в него код, который устанавливает размеры вашей Ellipse равной наименьшей стороне содержащейся ячейки. Пример C #:

void MyGridSizeChanged(object sender, SizeChangedEventArgs e) {
    if (sender is Grid myGrid) {
        var cellHeight = myGrid.RowDefinitions[Grid.GetRow(MyEllipse)].ActualHeight;
        var cellWidth  = myGrid.ColumnDefinitions[Grid.GetColumn(MyEllipse)].ActualWidth;
        var newSize    = Math.Min(cellHeight, cellWidth);

        MyEllipse.Height = newSize;
        MyEllipse.Width  = newSize;
    }
}
0
thinOptimist 8 Ноя 2018 в 13:06