2009-07-14 51 views
18

我不知道这个简单的事情会稍微复杂一点。我有一个画布,我试图动态地添加Ellipse。下面是代码:以编程方式更改WPF元素的位置

<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是不是一个有效的价值!

回答

24

下面是答案:

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

GetRandomValue返回什么? – 2013-03-12 17:36:42

+0

@ArlenBeiler显然是一个随机值。这里的要点是使用SetLeft/SetTop而不是SetValue。 – 2014-06-23 19:25:05

13

原因100不工作是SetValue()将它解释为一个整数,但是Canvas.Top & Canvas.Left双打。改为尝试100d。另外SetLeft() & SetTop()工作,因为他们期望双打。

+0

我只希望错误更具信息性! – azamsharp 2009-07-14 14:53:50

-6

尝试使用转换整型到双师型 “CDbl” 功能

试试这个:

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

下面的代码工作:

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

的值是double类型的。

0

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

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

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

如果我们的依赖对象是一个包含在它们中而不是在Canvas中的FrameworkElement,那么大多数其他容器,比方说Grid将忽略那些属性值。人们可以做出虽然尊重这些属性

如果要移动与矩阵画布,你应该做这样的
0

其他容器:

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

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

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

希望这可以帮助你。

相关问题