Я не знал, что эта простая вещь будет немного сложнее. У меня есть холст, на котором я пытаюсь динамически добавить эллипс. Вот код:
<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 ответов
Вот ответ:
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);
Значения имеют двойной тип.
Left и Top - это присоединенные свойства, принадлежащие классу Canvas, которые вы можете присоединить к любому DependencyObject, независимо от того, является ли он FrameworkElement или нет, и размещен ли он на Canvas или нет.
Вот почему вы должны использовать:
MyDependencyObject.SetValue (Canvas.LeftProperty, leftValue); myDependencyObject.SetValue (Canvas.TopProperty, topValue);
Большинство других контейнеров, например Grid, просто игнорируют эти значения свойств, если наш объект зависимости является FrameworkElement, содержащимся в них, а не внутри Canvas. Можно было бы сделать другие контейнеры, которые уважают эти свойства
Попробуйте преобразовать целочисленный тип в тип Double с помощью функции "CDbl"
Попробуй это:
ellipse.SetValue(Canvas.LeftProperty,Cdbl(100));
Если вы хотите переместить холст с помощью матрицы, сделайте следующее:
<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);
Надеюсь, это тебе поможет.
Похожие вопросы
Связанные вопросы
Новые вопросы
wpf
Windows Presentation Foundation, или WPF, является подсистемой для визуализации пользовательских интерфейсов в приложениях на основе Windows.