#c# #xaml #xamarin.forms
#c# #xaml #xamarin.forms
Вопрос:
на странице просмотра — код xaml
<ScrollView>
<StackLayout Orientation="Vertical" x:Name="SL">
</StackLayout>
</ScrollView>
код позади
public Page3()
{
InitializeComponent();
InitAsync();
}
private async void InitAsync()
{
await Task.Run(() =>
{
Thread.Sleep(3000);
});
btn5.Text = "Task 1 Done";
await Task.Run(() =>
{
Thread.Sleep(1000);
});
btn6.Text = "Task 2 Done";
Button[] btn1 = new Button[2000];
for(int i=0; i< btn1.Length; i )
{
btn1[i] = new Button();
btn1[i].HorizontalOptions = LayoutOptions.Fill;
btn1[i].HeightRequest = 50;
btn1[i].Text = i.ToString();
SL.Children.Add(btn1[i]);
}
}
теперь проблема в том, что приложение зависает, пока цикл for не добавит все кнопки,
как я могу позволить приложению не зависать, когда этот цикл работает? Спасибо.
Комментарии:
1. Я собираюсь задать вопрос, почему вы хотите добавить 2000 кнопок в пользовательский интерфейс? 🙂
2. его билеты, и у каждого билета есть идентификационный номер, когда вы нажимаете на кнопку с идентификационным номером билета, откроется новая страница со всей информацией об этом билете,
3. я просто хочу знать, каков наилучший способ добавить много дочерних элементов управления, не замораживая пользовательский интерфейс?
4. Вам следует рассмотреть возможность использования «CollectionView», поскольку это позволит вам представить большое количество при оптимизации и отображать только то, что должно быть на экране. docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface /…
5. почему вы не используете
ListView
@KhalidOsama
Ответ №1:
Попробуйте это, это не заморозит ваш пользовательский интерфейс
Xaml
<StackLayout>
<Button Text="Add Data" Clicked="Button_Clicked"/>
<ListView x:Name="myListView">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Button Text="{Binding .}"/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
Код позади
private ObservableCollection<string> longList = new ObservableCollection<string>();
public ObservableCollection<string> LongList { get => longList; set { longList = value; OnPropertyChanged(nameof(LongList)); } }
...
private void Button_Clicked(object sender, System.EventArgs e)
{
Task.Run(() =>
{
for (int i = 0; i < 2000; i )
{
LongList.Add(i.ToString());
}
Device.BeginInvokeOnMainThread(() =>
{
myListView.ItemsSource = LongList;
});
});
}
Комментарии:
1. теперь у меня есть еще одна небольшая проблема: когда я использую list и создаю ItemTemplate и cell, я хочу, чтобы кнопки окрашивались в красный цвет, когда data = 1 , и зеленый, когда data = 2, и желтый, когда data = 3 как я могу это сделать? DataTemplate ItemTemplate = news DataTemplate(() => { // как я могу выполнить условия if для выбора нужного цвета, если нарушение = 1 }
2. вы можете выполнять триггеры или конвертеры данных
3. извините, не могли бы вы дать мне небольшой пример кода, пожалуйста? Спасибо.
4. та же проблема, мне нужно решение, пожалуйста? DataTemplate ItemTemplate = new DataTemplate(() => { Label birthdayLabel = new Label(); birthdayLabel. FontSize = 10; if() birthdayLabel. textColor = Цвет. Красный; else { birthdayLabel. textColor = Цвет. Желтый; } } ListView1.ItemTemplate = ItemTemplate; как это работает в этой проблеме ?!
5. отправьте еще один вопрос, упростите свой вариант использования.