在WPF中通过编程方式改变元素位置

23

我没有想到这个简单的事情会稍微有点复杂。我有一个 Canvas,在其中我正在尝试动态添加椭圆。以下是代码:

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

下面是代码:

private void Button_Click(object sender, RoutedEventArgs e)
        {
            Ellipse ellipse = new Ellipse();
            ellipse.Fill = Brushes.Red;
            ellipse.Width = 10;
            ellipse.Height = 10;

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

            canvas.Children.Add(ellipse); 


        }

由于某些原因,它会抛出异常,指出100不是一个有效的值!

6个回答

34

这是答案:

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

GetRandomValue 返回什么? - Arlen Beiler
1
@ArlenBeiler 显然是一个随机值。这里的重点是使用SetLeft/SetTop而不是SetValue。 - Jim Balter

15

之所以 100 不起作用是因为 SetValue() 把它解释成整数,但是 Canvas.TopCanvas.Left 是双精度浮点数。尝试使用 100d。此外,SetLeft()SetTop() 起作用是因为它们期望双精度浮点数。


8
以下代码是可行的:
ellipse.SetValue(Canvas.LeftProperty,100.0);
ellipse.SetValue(Canvas.TopProperty,100.0);

该数值为双精度类型。

1

如果您想使用矩阵移动画布,则应按如下方式操作:

<Canvas Name="mcanvas" >
   <Canvas.RenderTransform>
     <MatrixTransform x:Name="mt"/>
   </Canvas.RenderTransform>
</Canvas>

然后,您可以在矩阵“mt”上执行所有想要的工作。像这样:

对于比例:

Matrix matrix = new Matrix();
matrix.Scale(1.5, 1.5);
mt.Matrix = matrix;
mcanvas.LayoutTransform = Transform.Identity;

翻译(改变位置):

Matrix matrix = new Matrix();
matrix.Translate(50, 0);
mt.Matrix = matrix;
mcanvas.LayoutTransform = Transform.Identity;

如果您想以编程方式创建一个画布元素,应该像这样做:
Ellipse el = new Ellipse();
Matrix matrix = new Matrix();
matrix.Translate(50, 0);
matrix.Scale(1.5,1.5);
el.RenderTransform = new MatrixTransform(matrix);

希望这可以帮助你。

0

左和上是Canvas类拥有的附加属性,您可以将它们附加到任何DependencyObject上,无论它是FrameworkElement还是其他类型,并且无论它是否托管在Canvas中。

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

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

大多数其他容器(例如Grid)将忽略这些属性值,如果我们的依赖对象是包含在其中而不是Canvas内部的FrameworkElement。但是,您可以创建其他容器来尊重这些属性。


-6
尝试使用 "CDbl" 函数将整数类型转换为 Double 类型。
尝试这个:
ellipse.SetValue(Canvas.LeftProperty,Cdbl(100));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接