【问题标题】:Adding buttons to StackPanel, lag when navigating to page向 StackPanel 添加按钮,导航到页面时滞后
【发布时间】:2013-11-05 16:41:32
【问题描述】:

如果我要向 StackPanel 添加按钮,我应该在什么时候运行以下代码?就目前而言,它在我的 OnNavigatedTo 函数中。我必须使用“async”属性声明它,因为我有一些代码可以从 SQLite DB 中获取记录。

问题是,当我访问这个“查看记录”页面时,我可以看到按钮被一个一个地绘制(所以只需要一秒钟但有一定的延迟,没有按钮,然后是一个,然后是两个,然后是三个等),显示不会出现按钮已经存在,它们一次添加一个,这很明显(这是使用模拟器和实际设备时)。我想知道我是不是误用了 OnNavigatedTo 事件,应该早点运行这段代码?

我确实尝试在构造函数中完成大部分操作,但由于某种原因,我无法访问 NavgiationContext 对象(我认为就是这样),以便从查询字符串中获取记录 id,我不认为我可以使用 aysnc 属性声明构造函数。我想也许在构造函数中调用 initializeComponent() 方法之前运行我的代码可以工作?

            // Add ButtonStackPanel
            StackPanel ButtonStackPanel = new StackPanel();
            ButtonStackPanel.Name = "ButtonStackPanel";
            MainStackPanel.Children.Insert(2, ButtonStackPanel);


            // Add Buttons
            while (await statement.StepAsync())
            {
              Button button = new Button();

              button.Click += this.disease_Click;
              button.Content = Names[statement.GetTextAt(0)];
              button.FontSize = 28;
              button.Height = 80;

              ButtonStackPanel.Children.Add(button);
            }

只是在做事的顺序方面寻找一些一般性建议,以及是否可以将我的大部分代码放在 OnNavigatedTo 事件方法中。

谢谢

【问题讨论】:

    标签: c# events button windows-phone-8 uielement


    【解决方案1】:

    目前,您先添加包含所有按钮的 StackPanel,然后再将按钮添加到 StackPanel。因此,您可以通过将调用放在循环之后来避免看到单独绘制的每个按钮:

    // Add ButtonStackPanel
    StackPanel ButtonStackPanel = new StackPanel();
    ButtonStackPanel.Name = "ButtonStackPanel";
    
    // Add Buttons
    while (await statement.StepAsync())
    {
        Button button = new Button();
    
        button.Click += this.disease_Click;
        button.Content = Names[statement.GetTextAt(0)];
        button.FontSize = 28;
        button.Height = 80;
    
        ButtonStackPanel.Children.Add(button);
    }
    
    MainStackPanel.Children.Insert(2, ButtonStackPanel);
    

    如果这需要太长时间,请考虑先添加加载动画,然后在添加带有按钮的 StackPanel 之前将其删除。

    在前面的步骤中加载数据总是很棘手,您最终会将逻辑拆分为多个类,这可能会成为维护的噩梦。另一种选择是显示加载动画,即:

    var progressBar = new ProgressBar() { IsIndeterminate = true };
    
    MainStackPanel.Children.Insert(1, progressBar);
    var stackPanel = new StackPanel();
    
    // ...
    
    MainStackPanel.Children.Remove(progressBar);
    MainStackPanel.Children.Insert(1, stackPanel);
    

    这样,您的用户现在就会知道某些事情仍在进行,例如正在准备中。

    【讨论】:

    • 感谢您的回答,这是一个改进,但 ButtonStackPanel 最初不存在,在显示之前存在延迟,但所有按钮现在同时出现,因为它们已经被添加到 StackPanel。
    • 在 OnNavigatedTo 事件触发之前尝试完成工作怎么样?
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 2011-06-24
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多