向StackPanel添加按钮,导航到页面时滞后

时间:2013-11-05 16:41:33

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

如果我要向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事件方法中就可以了。

由于

1 个答案:

答案 0 :(得分:0)

目前,在将按钮添加到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);

这样,您的用户现在仍然可以继续正在准备中。