2009-07-14 2 views
18

Я не знал, что эта простая вещь будет немного сложной. У меня есть Canvas, в котором я пытаюсь добавить 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? –

+0

@ArlenBeiler Случайное значение, очевидно. Здесь нужно использовать SetLeft/SetTop, а не SetValue. –

13

Причина 100 не работает в том, что SetValue() интерпретирует его как целое число, но Canvas.Top & Canvas.Left двойники. Вместо этого попробуйте 100d. Также SetLeft() & SetTop() Работа, потому что они ожидают удвоения.

+0

Хотелось бы только, чтобы ошибка была более информативной! – azamsharp

-6

Попытка преобразовать целое число типа для двойного типа с помощью функции "CDbl"

Попробуйте это:

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

Это не VBScript. –

6

Код ниже работы:

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

Значения двойного типа ,

0

В левом и верхнем строениях находятся свойства, принадлежащие классу Canvas, которые можно прикрепить к любому DependencyObject, независимо от того, является ли это элементом FrameworkElement или нет или размещен ли он на холсте или нет.

Вот почему вы должны использовать:

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

Большинство других контейнеров, скажем, Grid просто игнорируют эти значения свойств, если наш объект зависимостей является элементом FrameworkElement, содержащимся в них, а не внутри Canvas. Можно было бы сделать хотя другие контейнеры, которые соблюдают эти свойства

0

, если вы хотите, чтобы переместить холст с матрицей вы должны сделать так:

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

, то вы можете сделать все работы вы хотите, на Матрице «мт» , Как это:

Для шкалы:

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

Надеюсь, это вам поможет.

Смежные вопросы