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