Ответ 1
Вот ответ:
Canvas.SetLeft(ellipse,GetRandomValue());
Canvas.SetTop(ellipse,GetRandomValue());
Я не знал, что эта простая вещь будет немного сложной. У меня есть 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 не является допустимым значением!
Вот ответ:
Canvas.SetLeft(ellipse,GetRandomValue());
Canvas.SetTop(ellipse,GetRandomValue());
Причина 100
не работает, так как SetValue()
интерпретирует ее как целое число, но Canvas.Top
и Canvas.Left
являются двойными. Вместо этого попробуйте 100d
. Также SetLeft()
и SetTop()
работают, потому что они ожидают удвоения.
Ниже приведен код:
ellipse.SetValue(Canvas.LeftProperty,100.0);
ellipse.SetValue(Canvas.TopProperty,100.0);
Значения имеют двойной тип.
В левом и верхнем строках находятся свойства, принадлежащие классу Canvas, которые вы можете присоединить к любому DependencyObject, независимо от того, является ли это элементом FrameworkElement или нет и размещен ли он на холсте или нет.
Вот почему вы должны использовать:
myDependencyObject.SetValue(Canvas.LeftProperty, leftValue); myDependencyObject.SetValue(Canvas.TopProperty, topValue);
В большинстве других контейнеров, например, Grid просто игнорирует эти значения свойств, если наш объект зависимостей является элементом FrameworkElement, содержащимся в них, а не внутри Canvas. Можно было бы сделать, если другие контейнеры, которые уважают эти свойства
если вы хотите переместить свой холст с матрицей, вы должны сделать вот так:
<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);
Надеюсь, это поможет вам.
Попробуйте преобразовать целочисленный тип в Double type, используя функцию "CDbl"
Попробуйте следующее:
ellipse.SetValue(Canvas.LeftProperty,Cdbl(100));