Я не знал, что эта простая вещь будет немного сложнее. У меня есть холст, на котором я пытаюсь динамически добавить эллипс. Вот код:

<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 не является допустимым значением!

23
azamsharp 14 Июл 2009 в 06:02

6 ответов

Лучший ответ

Вот ответ:

Canvas.SetLeft(ellipse,GetRandomValue());
Canvas.SetTop(ellipse,GetRandomValue());
31
Cam 10 Июл 2013 в 20:38

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

15
Alec Mev 22 Авг 2012 в 16:38

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

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

Значения имеют двойной тип.

8
sth 4 Фев 2011 в 04:50

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

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

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

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

0
George Birbilis 1 Дек 2015 в 10:21

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

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

ellipse.SetValue(Canvas.LeftProperty,Cdbl(100));
-6
sth 4 Фев 2011 в 04:50

Если вы хотите переместить холст с помощью матрицы, сделайте следующее:

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

Тогда вы можете делать все, что захотите, на Matrix "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);

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

1
Sayed Mohammad Amin Emrani 17 Апр 2017 в 11:02