只需在layoutroot中添加文本块即可冻结Silverlight应用程序

时间:2013-01-25 17:14:41

标签: c# silverlight

我无法理解为什么在这个简单的Silverlight应用程序冻结了。这是代码:

namespace test
{
public partial class MainPage : UserControl
{
    TextBlock txtword;
    public MainPage()
    {

        InitializeComponent();

        txtword = new TextBlock();
        txtword.Text = "TEST";

        LayoutRoot.Children.Add(txtword);
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        txtword.Text = "SuperDuper";
    }

}
}

如果您尝试悬停或单击按钮将文本块添加到layoutroot后,您可以告诉应用程序由于某种原因已冻结。知道这里发生了什么吗?

如果我在XAML中添加文本块,我可以在按钮单击中更改其文本属性。 LayoutRoot.Children.Add()导致应用程序冻结..

1 个答案:

答案 0 :(得分:1)

从阅读你的评论看来,MainPage.xaml中的XAML似乎如下:

<Grid x:Name="LayoutRoot" Background="White">
    <Button Content="Do stuff" Click="Button_Click" />
</Grid>

在代码或XAML中添加TextBlock后,您最终会得到以下结果:

<Grid x:Name="LayoutRoot" Background="White">
    <Button Content="Do stuff" Click="Button_Click" />
    <TextBlock Text="TEST" />
</Grid>

您的Grid未指定任何ColumnDefinitionRowDefinition s,因此您拥有1×1网格,其中包含Grid的所有子控件网格的宽度和高度。

由于ButtonTextBlock都没有指定z-index值(使用Canvas.ZIndex),因此他们的z顺序是由他们在网格Children中的位置定义的。 TextBlock位于Button之后,因此它位于“顶部”。

TextBlock可能只包含少量文字,但TextBlock本身仍会填充GridTextBlock不会自动调整大小以适应它们包含的文本而不会其他任何内容。您的Button似乎无法正常工作,因为TextBlock位于其顶部并接收所有鼠标事件。 TextBlock是静态控件,不会响应任何鼠标事件,这可以解释为什么您的应用似乎会冻结。

HorizontalAlignment的{​​{1}}和/或VerticalAlignment设置为TextBlock以外的值可以阻止Stretch获得整个宽度和高度TextBlock并允许Grid接收鼠标事件。