在WPF中以编程方式更改元素的位置

在WPF中以编程方式更改元素的位置,wpf,layout,Wpf,Layout,我不知道这件简单的事情会有点复杂。我有一个画布,我试图在其中动态添加椭圆。代码如下: <StackPanel> <Canvas Name="canvas" Background="LightBlue" Margin="5" Width="250" Height="250"> </Canvas> <Button Content="Draw Images" Click="Button_Click" Wid

我不知道这件简单的事情会有点复杂。我有一个画布,我试图在其中动态添加椭圆。代码如下:

<StackPanel>

        <Canvas Name="canvas" Background="LightBlue" Margin="5" Width="250" Height="250">

        </Canvas>

        <Button Content="Draw Images" Click="Button_Click" Width="100" Margin="10" />

    </StackPanel>
出于某种原因,它抛出了一个异常,即100不是有效值

答案如下:

Canvas.SetLeft(ellipse,GetRandomValue());
Canvas.SetTop(ellipse,GetRandomValue());

100
不起作用的原因是
SetValue()
将其解释为整数,但
Canvas.Top
Canvas.Left
是双精度的。改为尝试
100d
。另外,
SetLeft()
&
SetTop()
也可以工作,因为它们需要双精度。

尝试使用“CDbl”函数将整数类型转换为双精度类型

试试这个:

ellipse.SetValue(Canvas.LeftProperty,Cdbl(100));
以下代码有效:

ellipse.SetValue(Canvas.LeftProperty,100.0);
ellipse.SetValue(Canvas.TopProperty,100.0);

值是双重类型。

左侧和顶部是由Canvas类拥有的附加属性,您可以附加到任何DependencyObject,无论它是否是FrameworkElement,也不管它是否位于Canvas中

这就是为什么您必须使用:

myDependencyObject.SetValue(Canvas.LeftProperty,leftValue); myDependencyObject.SetValue(Canvas.TopProperty,topValue)


如果依赖项对象是包含在其中而不是画布中的FrameworkElement,那么大多数其他容器(比如网格)都会忽略这些属性值。如果您想使用矩阵移动画布,您可以使用其他符合这些属性的容器,您应该执行以下操作:

<Canvas Name="mcanvas" >
   <Canvas.RenderTransform>
     <MatrixTransform x:Name="mt"/>
   </Canvas.RenderTransform>
</Canvas>
Ellipse el = new Ellipse();
Matrix matrix = new Matrix();
matrix.Translate(50, 0);
matrix.Scale(1.5,1.5);
el.RenderTransform = new MatrixTransform(matrix);
对于平移(改变位置):

如果要以编程方式创建画布元素,应执行以下操作:

<Canvas Name="mcanvas" >
   <Canvas.RenderTransform>
     <MatrixTransform x:Name="mt"/>
   </Canvas.RenderTransform>
</Canvas>
Ellipse el = new Ellipse();
Matrix matrix = new Matrix();
matrix.Translate(50, 0);
matrix.Scale(1.5,1.5);
el.RenderTransform = new MatrixTransform(matrix);

希望这对您有所帮助。

GetRandomValue返回什么?@ArlenBeiler显然是一个随机值。这里的要点是使用SetLeft/SetTop而不是SetValue。
Ellipse el = new Ellipse();
Matrix matrix = new Matrix();
matrix.Translate(50, 0);
matrix.Scale(1.5,1.5);
el.RenderTransform = new MatrixTransform(matrix);