我有这个恼人的问题而且我不知道如何解决这个问题。
在Xamarin Forms中,我试图绘制动态布局,为此我加载了一个元素列表(这是有效的)。现在我试图为它显示标签,所以我遍历所有项目并为每个项目添加标签。问题是页面保持空白。
是的我将_layout变量初始化为StackLayout并且我还创建了一个ScrollView,然后我将scrollview的内容设置为_layout变量。但我的页面仍然是空的。我无法分享实际的代码,但我用不同的名称重写了它。
private void DrawItems()
{
var items = (List<Item>)_database.GetItems();
foreach(var item in items)
{
DrawItem(item);
}
}
private void DrawItem(Item item)
{
AddLabel(item);
}
private void AddLabel(Item item)
{
if (string.IsNullOrEmpty(item.Text)) return;
var label = new Label
{
Text = (!string.IsNullOrEmpty(item.Number)) ? string.Format("{0}: {1}", item.Number, item.Text) : item.Text,
FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label))
};
_layout.Children.Add(label);
}
出于一些奇怪的原因,当我开始调试(在var标签上放一个中断......)标签得到了创建,但是当我在_layout.Children.Add(标签)上休息时,这永远不会得到调用。
答案 0 :(得分:0)
更改UI元素时,需要在主线程上执行此操作。
试试这个:
Device.BeginInvokeOnMainThread(() =>
{
_layout.Children.Add(label);
}
我已经尝试了以下代码,它对我有用。我使用的是Xamarin.Forms 1.4.0.6341
public class MyPage : ContentPage
{
StackLayout stack;
public MyPage()
{
var scroll = new ScrollView();
stack = new StackLayout();
var btn = new Button {Text = "Add Label"};
btn.Clicked += (sender, args) => stack.Children.Add(new Label {Text = "Test"});
stack.Children.Add(btn);
AddLabelEverySecond();
scroll.Content = stack;
Content = scroll;
}
private async void AddLabelEverySecond()
{
for (var i = 0; i < 10; i++)
{
await Task.Delay(1000);
stack.Children.Add(new Label { Text = "1 second" });
}
}
}
这适用于您的代码吗?也许你可以告诉我们在哪里调用DrawItems
?