2009-07-14 92 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); 

希望這可以幫助你。

相關問題