【问题标题】:C# WPF how to draw a circle which extends to fill its parent and remains a circle in code behindC#WPF如何绘制一个延伸以填充其父级并在后面的代码中保持一个圆圈的圆圈
【发布时间】:2017-05-28 12:54:04
【问题描述】:

我必须在网格中画一个圆圈。该网格必须按比例适应其父网格的列/行定义所定义的高度和宽度。 现在如果我把它拉伸它会填满所有的空间并变成一个省略号,而我希望它是一个圆圈。

好的,简而言之,父网格会像这样按比例调整

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

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

但效果如下:

所以即使我只放置垂直而不是水平约束,它也会垂直和水平拉伸。如果我将它设置为居中,椭圆会塌陷。

为了解决这个问题,即使我不确定这是不是正确的做法,我尝试查看父网格的权重/高度,但显然这些值和实际值都设置为零。

感谢您的帮助 帕特里克

【问题讨论】:

标签: c# wpf grid constraints ellipse


【解决方案1】:

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

【讨论】:

  • 是的,理论上可能是这样,但在我的情况下并非如此。非常感谢马克西姆!!
  • @elgonzo 那么我的解决方案将不起作用。但是如果HorizontalAlignmentVerticalAlignmentCenter,则使用Stretch.Uniform 将不起作用,因此它也不是通用解决方案。
  • 没错,将形状居中会干扰(所需的)尺寸计算:(让我看看我是否可以做一些可以纯粹在 XAML 中完成并且很简单的东西......
  • @elgonzo 是的,不幸的是,真正的 WPF 应用程序包含许多值转换器、多重绑定、触发器、事件魔术、代码隐藏和其他“有趣”的东西,只有编写所有这些东西的人才能清楚。至少第一个月 :)
  • 好吧,一年后,人们忘记了一半关于所有转换器、行为和未编写和使用的东西:)...关于我试图找到一种没有代码的方法;我放弃。我想我可以用 RenderTransforms 和 RenderTransformOrigin 做点什么,但你仍然需要做一些数学运算:(
【解决方案2】:

每次调整父 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;
    }
}

【讨论】:

  • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和/或文档链接。如果没有围绕它们的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 2020-01-30
  • 1970-01-01
  • 2018-12-15
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多