簡體   English   中英

C#WPF如何繪制一個圓圈以擴展以填充其父代並在后面的代碼中保持一個圓圈

[英]C# WPF how to draw a circle which extends to fill its parent and remains a circle in code behind

我必須在網格中畫一個圓。 該網格必須按比例適應其父網格的“列/行”定義所定義的高度和寬度。 現在,如果我拉伸,它將填充所有空間並變成省略號,而我希望它是一個圓。

簡而言之,父網格像這樣按比例適應 在此處輸入圖片說明

然后在例程中添加以下代碼:

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;
}

但是效果如下:

在此處輸入圖片說明

因此即使我只放置垂直約束而不是水平約束,它也會在垂直和水平方向上拉伸。 如果將其設置為居中,則橢圓會崩潰。

為了解決該問題,即使我不確定這樣做是否正確,我也嘗試查看父網格的權重/高度,但顯然這些值和實際值都設置為零。

感謝您對Patrick的幫助

如何將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大小。

您應該將SizeChanged Event添加到Grid中。 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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM