代码之家  ›  专栏  ›  技术社区  ›  azamsharp

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

  •  19
  • azamsharp  · 技术社区  · 15 年前

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

    <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 回复  |  直到 7 年前
        1
  •  25
  •   Cam    11 年前

    答案如下:

    Canvas.SetLeft(ellipse,GetRandomValue());
    Canvas.SetTop(ellipse,GetRandomValue());
    
        2
  •  14
  •   Alec Mev    12 年前

    原因 100 不起作用是吗 SetValue() 将其解释为整数,但 Canvas.Top 和; Canvas.Left 是双打。尝试 100d 相反。阿尔索 SetLeft() 和; SetTop() 工作是因为他们期望双打。

        3
  •  8
  •   sth ACP    14 年前

    以下代码有效:

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

    值为双精度类型。

        4
  •  0
  •   George Birbilis    9 年前

    左侧和顶部是Canvas类拥有的附加属性,可以附加到任何DependencyObject,无论它是否为FrameworkElement,也不管它是否宿主在画布中。

    所以你必须使用:

    myDependencyObject.setValue(canvas.leftProperty,leftValue); myDependencyObject.setValue(canvas.topProperty,topValue);

    大多数其他容器,比如说网格将忽略这些属性值,如果我们的依赖对象是包含在它们中的frameworkelement,而不是画布中。一个可以使其他容器尊重这些属性

        5
  •  0
  •   Sayed Mohammad Amin Emrani    7 年前

    如果要用矩阵移动画布,请执行以下操作:

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

    希望这对你有帮助。

        6
  •  -6
  •   sth ACP    14 年前

    尝试使用“cdbl”函数将integer类型转换为double类型

    试试这个:

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