【问题标题】:Changing Position of an Element Programmatically in WPF在 WPF 中以编程方式更改元素的位置
【发布时间】:2010-11-10 12:30:23
【问题描述】:

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

<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 不是有效值的异常!

【问题讨论】:

    标签: wpf layout


    【解决方案1】:

    答案如下:

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

    【讨论】:

    • GetRandomValue 返回什么?
    • @ArlenBeiler 显然是一个随机值。这里的重点是使用 SetLeft/SetTop 而不是 SetValue。
    【解决方案2】:

    100 不起作用的原因是 SetValue() 将其解释为整数,但 Canvas.TopCanvas.Left 是双精度数。请改用100dSetLeft()SetTop() 也可以工作,因为他们期望双打。

    【讨论】:

      【解决方案3】:

      以下代码有效:

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

      值是双精度类型。

      【讨论】:

        【解决方案4】:

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

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

        希望对你有所帮助。

        【讨论】:

          【解决方案5】:

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

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

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

          如果我们的依赖对象是包含在其中而不是在 Canvas 中的 FrameworkElement,则大多数其他容器,例如 Grid 将忽略这些属性值。可以制作其他尊重这些属性的容器

          【讨论】:

            【解决方案6】:

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

            试试这个:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-07-16
              • 1970-01-01
              • 2015-11-12
              • 1970-01-01
              • 1970-01-01
              • 2012-01-12
              • 1970-01-01
              相关资源
              最近更新 更多