【发布时间】:2010-09-10 03:38:24
【问题描述】:
我想在画布上放置一个椭圆。我希望椭圆的中心超过这一点。目前椭圆的最左上角已经超过了这个点。
我知道我可以在画布上以编程方式移动椭圆,但我想知道是否有办法告诉 WPF 将元素置于该点的中心,而不是从左上角调整它的大小???
【问题讨论】:
标签: c# .net wpf canvas geometry
我想在画布上放置一个椭圆。我希望椭圆的中心超过这一点。目前椭圆的最左上角已经超过了这个点。
我知道我可以在画布上以编程方式移动椭圆,但我想知道是否有办法告诉 WPF 将元素置于该点的中心,而不是从左上角调整它的大小???
【问题讨论】:
标签: c# .net wpf canvas geometry
我不知道 Ellipse 中有任何内置功能可以将其中心设置在一个点上,但您可以扩展 Ellipse 类来做到这一点。
将此类添加到项目中
public static class EllipseX
{
public static void SetCenter(this Ellipse ellipse, double X, double Y)
{
Canvas.SetTop(ellipse, Y - ellipse.Height/2);
Canvas.SetLeft(ellipse, X - ellipse.Width/2);
}
}
然后在 xaml 中创建椭圆
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Canvas Background="LightGray">
<Ellipse
Name="myEllipse"
Fill="Red"
Height="75"
Width="75"
/>
</Canvas>
</Window>
然后在后面的代码中写下 int 代码:
myEllipse.SetCenter(200,200);
这样做的好处是您不必重复在您创建的每个椭圆中寻找中心的逻辑。
希望这会有所帮助。
【讨论】:
public static void SetCenter(this Shape s, double X, double Y){...}
不,没有这样的方法。左上角是左上角,因为它是左上角:)。或者,如果您知道椭圆尺寸,您可以移动点而不是移动椭圆。
【讨论】:
您可以将TranslateTransform 应用于椭圆,但这需要您知道它的宽度和高度。
【讨论】:
我在将 ScaleTransform 的中心设置为不同大小的控件样式时遇到了类似的问题。 最终使用转换器绑定到除以 2 的 ActualWidth/ActualHeight。正如 Rune Grimstad 提到的那样,使用 TranslateTransform 应该同样适用。
<ScaleTransform CenterX="{Binding ActualWidth, Converter={StaticResource divisionConverter}}"
CenterY="{Binding ActualHeight, Converter={StaticResource divisionConverter}}"
ScaleX="1.2"
ScaleY="1.2" />
【讨论】: