Xamarin.Forms代码后台循环创建Frame仅一个有元素,其余为空原因
问题原因分析
你遇到的这个问题核心在于同一个StackLayout实例只能被绑定到一个父控件上。你在循环外部创建了WordDetail这个StackLayout容器,然后每次循环都把它赋值给新创建的Frame的Content。当你把它添加到第二个Frame时,它会自动从第一个Frame的Children集合中移除,最后自然只有最后一个Frame能保留这个StackLayout,前面的Frame就都变成空的了。
修复方案
把WordDetail的创建逻辑移到循环内部,让每个Frame都拥有自己独立的StackLayout容器,这样每个Frame的内容就不会被覆盖或移走了。修改后的代码如下:
private void searchResults_ItemTapped(object sender, ItemTappedEventArgs e) { searchResults.IsVisible = false; Indexes Indexes = (Indexes)searchResults.SelectedItem; _viewModel.Items.Add(db.RequestToJson(Indexes.Index)); searchbar.Text = string.Empty; StackLayout Words = new StackLayout(); foreach (var dt in _viewModel.Items) { // 每次循环都新建一个独立的WordDetail容器 StackLayout WordDetail = new StackLayout(); AddTextToLabel(nameof(dt.Word), dt.Word, WordDetail); var BaseLang = dt.BaseLang; AddTextToLabel(nameof(BaseLang.Meaning), BaseLang.Meaning, WordDetail); Words.Children.Add(new Frame { BackgroundColor = Color.FromHex("2196F3"), Padding = 5, HasShadow = false, Margin = new Thickness(10, 10, 80, 10), Content = new StackLayout { Children = { WordDetail } } }); } SearchResult.Content = Words; SearchResult.IsVisible = true; } private void AddTextToLabel(string title, string data, StackLayout worddetail) { worddetail.Children.Add(new Label { Text = title + ":", FontAttributes = FontAttributes.Bold, TextColor = Color.White }); worddetail.Children.Add(new Label { Text = data, TextColor = Color.White }); }
额外补充
在Xamarin.Forms(以及大多数UI框架)中,所有可视化元素都有唯一的Parent属性,当你尝试将同一个元素添加到另一个父控件时,框架会自动将它从原父控件中移除——这是为了保证UI层级结构的唯一性和合理性。所以如果需要为多个父控件提供内容,一定要为每个父控件创建独立的子元素实例。
内容的提问来源于stack exchange,提问作者Ali Naeimi
相关产品推荐
相关产品推荐

