问题描述
我遇到异常,即在设置DoubleAnimation的StoryBoard.TargetName时找不到动态设置的椭圆名称....
我的XAML中已经有了StoryBoard ...
Im getting Exception that name of ellipse which is dynamically set is not found while setting StoryBoard.TargetName of DoubleAnimation....
I already have StoryBoard in my XAML...
public void CreateRandomStars()
{
int Width = (int)MyCanvas.Width;
int Height = (int)MyCanvas.Height;
Random Rnx = new Random(0);
for (int i = 0; i < 300; i++)
{
double Lx = (double)Rnx.Next(Width);
double Ty = (double)Rnx.Next(Height);
starPoints.Add(Ty);
Ellipse es = new Ellipse();
es.Name = "es_" + i.ToString(); //setting names dynamically for each
//ellipse
es.Width = 2;
es.Height = 2;
es.Fill = Brushes.WhiteSmoke;
es.SetValue(Canvas.LeftProperty, Lx);
es.SetValue(Canvas.TopProperty, Ty);
MyCanvas.Children.Add(es);
DoubleAnimation dAnim = new DoubleAnimation();
dAnim.From = Ty;
dAnim.To = Height;
dAnim.Duration = new Duration(new TimeSpan(0, 0, 5));
dAnim.SetValue(Storyboard.TargetNameProperty, es.Name); //Getting Error
dAnim.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath(Canvas.TopProperty));
MyStoryBoard.Children.Add(dAnim);
}
}
在"System.Windows.Controls.Canvas"的名称范围中找不到{''es_0"名称.}
这是错误...
XAML代码
{"''es_0'' name cannot be found in the name scope of ''System.Windows.Controls.Canvas''."}
This is the error...
XAML code
<Canvas Name="MyCanvas" Background="Black" Height="310" Width="500">
<Canvas.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever" Name="MyStoryBoard">
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Canvas.Triggers>
</Canvas>
推荐答案
<EventTrigger RoutedEvent="Canvas.Loaded">
在这里,我从MyCanvas''s Loaded
事件调用CreateRandomStars()
方法.
但是,当从Window''s Loaded
事件调用CreateRandomStars()
方法时,我收到了错误消息.这很容易理解.触发Window''s Loaded
事件时,画布中的子级尚未准备好.因此,请在MyCanvas''s Loaded
事件中调用该方法,并如上所述更改XAML.
将其标记为答案(如果有帮助的话).
Here I am calling CreateRandomStars()
method from MyCanvas''s Loaded
event.
But when CreateRandomStars()
method is called from Window''s Loaded
event, I am getting the error message. It is simple to understand. The Children in the Canvas is not ready when Window''s Loaded
event is fired. So, call the method in MyCanvas''s Loaded
event and change the XAML as I mentioned above.
Mark it as answer, if it is helpful.
public void CreateRandomStars()
{
int Width = (int)MyCanvas.Width;
int Height = (int)MyCanvas.Height;
Random Rnx = new Random(0);
for (int i = 0; i < 300; i++)
{
double Lx = (double)Rnx.Next(Width);
double Ty = (double)Rnx.Next(Height);
//starPoints.Add(Ty);
Ellipse es = new Ellipse();
es.Name = "es_" + i.ToString(); //setting names dynamically for each
//ellipse
es.Width = 2;
es.Height = 2;
es.Fill = Brushes.WhiteSmoke;
es.SetValue(Canvas.LeftProperty, Lx);
es.SetValue(Canvas.TopProperty, Ty);
MyCanvas.Children.Add(es);
this.RegisterName(es.Name, es);
DoubleAnimation dAnim = new DoubleAnimation();
dAnim.From = Ty;
dAnim.To = Height;
dAnim.Duration = new Duration(new TimeSpan(0, 0, 5));
Storyboard.SetTargetName(dAnim, es.Name);
Storyboard.SetTargetProperty(dAnim, new PropertyPath(Canvas.TopProperty));
//StoryBoard.SetValue(Storyboard.TargetNameProperty, es.Name); //Getting Error
//dAnim.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath(Canvas.TopProperty));
MyStoryBoard.Children.Add(dAnim);
}
}
当您希望其他对象引用动态创建的元素时,RegisterName是必需的.
我希望这对您有用.
The RegisterName is necessary when you want other object to refer your dynamically created element.
I hope this will work for you.
这篇关于找不到名称InvalidOperationException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!