Подтвердить что ты не робот

Изменение позиции элемента программно в WPF

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

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

4b9b3361

Ответ 1

Вот ответ:

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

Ответ 2

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

Ответ 3

Ниже приведен код:

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

И если вы хотите программно создать элемент canvas, вы должны сделать вот так:

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

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

Ответ 6

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

Попробуйте следующее:

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