C# WPF 如何绘制一个圆圈以填充其父级并在代码后面保持圆圈
C# WPF how to draw a circle which extends to fill its parent and remains a circle in code behind
我必须在网格中画一个圆。该网格必须按比例适应由其父网格的 Column/Row 定义定义的高度和宽度。
现在,如果我放拉伸,它将填充所有 space 并变成省略号,而我希望它是一个圆圈。
好吧,简而言之,父网格会像那样按比例调整
然后在例程中添加以下代码:
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;
}
但效果如下:
所以即使我只设置垂直约束而不设置水平约束,它也会垂直和水平拉伸。如果我将它设置为居中,椭圆就会折叠。
为了解决问题,即使我不确定这是正确的做法,我尝试查看父网格的 weight/heigth,但显然这些值和实际值都已设置归零。
感谢帮助
帕特里克
将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);
每次调整父 Grid
大小时,您都可以更新 Ellipse
的大小。
您应该将 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;
}
}
我必须在网格中画一个圆。该网格必须按比例适应由其父网格的 Column/Row 定义定义的高度和宽度。 现在,如果我放拉伸,它将填充所有 space 并变成省略号,而我希望它是一个圆圈。
好吧,简而言之,父网格会像那样按比例调整
然后在例程中添加以下代码:
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;
}
但效果如下:
所以即使我只设置垂直约束而不设置水平约束,它也会垂直和水平拉伸。如果我将它设置为居中,椭圆就会折叠。
为了解决问题,即使我不确定这是正确的做法,我尝试查看父网格的 weight/heigth,但显然这些值和实际值都已设置归零。
感谢帮助 帕特里克
将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);
每次调整父 Grid
大小时,您都可以更新 Ellipse
的大小。
您应该将 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;
}
}