我不知道这个简单的事情会有点复杂。我有一个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不是有效值的异常!
答案 0 :(得分:26)
以下是答案:
Canvas.SetLeft(ellipse,GetRandomValue());
Canvas.SetTop(ellipse,GetRandomValue());
答案 1 :(得分:14)
100
不起作用的原因是SetValue()
将其解释为整数,但是Canvas.Top
&amp; Canvas.Left
是双打。请尝试使用100d
。 SetLeft()
&amp; SetTop()
工作是因为他们期望双打。
答案 2 :(得分:8)
以下代码有效:
ellipse.SetValue(Canvas.LeftProperty,100.0);
ellipse.SetValue(Canvas.TopProperty,100.0);
值是双重类型。
答案 3 :(得分:0)
Left和Top是Canvas类拥有的附加属性,您可以将其附加到任何DependencyObject,无论它是否为FrameworkElement,以及它是否托管在Canvas中。
这就是你必须使用的原因:
myDependencyObject.SetValue(Canvas.LeftProperty,leftValue); myDependencyObject.SetValue(Canvas.TopProperty,topValue);
大多数其他容器,如果我们的依赖项对象是包含在其中的FrameworkElement而不是Canvas中,那么Grid将忽略这些属性值。人们可以通过其他容器来制造这些属性
答案 4 :(得分:0)
如果你想用矩阵移动画布,你应该这样做:
<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);
希望这会对你有所帮助。
答案 5 :(得分:-6)
尝试使用“CDbl”函数将整数类型转换为Double类型
试试这个:
ellipse.SetValue(Canvas.LeftProperty,Cdbl(100));