Изменение позиции элемента программно в WPF - PullRequest
20 голосов
/ 14 июля 2009

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

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

Ответы [ 6 ]

26 голосов
/ 14 июля 2009

Вот ответ:

Canvas.SetLeft(ellipse,GetRandomValue());
Canvas.SetTop(ellipse,GetRandomValue());
14 голосов
/ 14 июля 2009

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

8 голосов
/ 09 сентября 2010

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

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

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

0 голосов
/ 17 апреля 2017

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

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

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

0 голосов
/ 01 декабря 2015

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

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

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

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

0 голосов
/ 24 января 2010

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

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

ellipse.SetValue(Canvas.LeftProperty,Cdbl(100));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...