所有
我在自定义用户控件中定义了一个通用列表。
private List<string> m_AnimationNames = new List<string>();
public List<string> AnimationNames
{
get { return this.m_AnimationNames; }
set { this.m_AnimationNames = value; }
}
我在xaml中引用此列表,并填充它,就像这样。
<local:AnimatedCharacter.AnimationNames>
<System:String>Walk</System:String>
<System:String>Run</System:String>
<System:String>Talk</System:String>
</local:AnimatedCharacter.AnimationNames>
然后我尝试在调用InitializeComponent()之后在代码的其他地方引用此列表,并且列表始终返回大小0并且不包含任何元素。
为什么这个列表在运行时是空的?当我在代码中访问它时,我错过了什么使这个列表计为0?
全班:
public partial class AnimatedCharacter : UserControl
{
private List<string> m_AnimationNames = new List<string>();
public AnimatedCharacter()
{
InitializeComponent();
DoSomething();
}
public List<string> AnimationNames
{
get { return this.m_AnimationNames; }
set { this.m_AnimationNames = value; }
}
public void DoSomething(){
Console.WriteLine("Anim: " + AnimationNames.Count);
}
}
}
XAML实例:
<local:AnimatedCharacter x:Name="ac_guy1" Height="315" Width="273" Canvas.Left="-666" Canvas.Top="-99" >
<local:AnimatedCharacter.AnimationNames>
<System:String>Walk</System:String>
<System:String>Run</System:String>
<System:String>Talk</System:String>
</local:AnimatedCharacter.AnimationNames>
</local:AnimatedCharacter>
答案 0 :(得分:4)
加载控件后调用DoSomething(等待Loaded事件)。在通过XAML设置AnimationNames属性之前,您在构造函数中调用它:
public AnimatedCharacter()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(OnLoaded);
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
this.DoSomething();
}
答案 1 :(得分:4)
当Xaml解析器到达Xaml的这一部分时: -
<local:AnimatedCharacter
它构造了一个AnimatedCharacter
的新实例,其中包含其构造函数的执行,InitialiseComponent
以及构造函数中的其他任何内容。当然,在这一点上,没有任何属性被解析并分配给适当的属性,并且Xaml中的子内容尚未被解析并添加到List中。
当读取了控件的整个Xaml并且控件已添加到可视树中时,将触发Loaded
事件。因此,如果您需要使用加载的List
,则需要在Loaded
事件处理程序中执行此操作,而不是在构造函数中。