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

时间:2009-07-14 02:02:26

标签: wpf layout

我不知道这个简单的事情会有点复杂。我有一个Canvas,我试图动态添加Ellipse。这是代码:

<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 个答案:

答案 0 :(得分:26)

以下是答案:

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

答案 1 :(得分:14)

100不起作用的原因是SetValue()将其解释为整数,但是Canvas.Top&amp; Canvas.Left是双打。请尝试使用100dSetLeft()&amp; SetTop()工作是因为他们期望双打。

答案 2 :(得分:8)

以下代码有效:

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

值是双重类型。

答案 3 :(得分:0)

Left和Top是Canvas类拥有的附加属性,您可以将其附加到任何DependencyObject,无论它是否为FrameworkElement,以及它是否托管在Canvas中。

这就是你必须使用的原因:

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

大多数其他容器,如果我们的依赖项对象是包含在其中的FrameworkElement而不是Canvas中,那么Grid将忽略这些属性值。人们可以通过其他容器来制造这些属性

答案 4 :(得分:0)

如果你想用矩阵移动画布,你应该这样做:

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

那么你可以在Matrix“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;

如果你想以编程方式创建一个canvas元素,你应该这样做:

Ellipse el = new Ellipse();
Matrix matrix = new Matrix();
matrix.Translate(50, 0);
matrix.Scale(1.5,1.5);
el.RenderTransform = new MatrixTransform(matrix);

希望这会对你有所帮助。

答案 5 :(得分:-6)

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

试试这个:

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