У меня есть приложение WPF, написанное на C#. На этом у меня есть элемент холста, который я хотел бы создать сетку кнопок, каждая кнопка будет иметь одинаковую ширину и высоту и располагаться бок о бок без интервала.Самый быстрый способ генерировать неизвестное количество кнопок во время выполнения без замораживания приложения?
Я пробовал несколько вещей, первое, что я сделал, было вложено для циклов в методе конструктора. Это заперло окно до тех пор, пока оно не было сделано с помощью кнопок, но было довольно быстро для сетки 100x100. Затем я переместил его на событие Loaded
, что позволило открыть окно сразу, но все же заблокировало его до тех пор, пока не будут созданы все кнопки.
Затем я попытался установить таймер и Dispatcher
на элементы пользовательского интерфейса, которые я хотел изменить, но это оказалось очень slow.
Вот моя текущая попытка на этом, она работает, и она не запирает окно пользовательского интерфейса, но оно все еще отвратительно медленное.
public partial class MainWindow : Window
{
private DispatcherTimer timer;
private int width = 100;
private int height = 100;
private int toDo = 0;
private int done = 0;
private int x = 0;
private int y = 0;
public MainWindow()
{
toDo = width * height;
InitializeComponent();
Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
//TimerCallback callback = generateButtons;
//timer = new Timer(callback, null, 1, 1);
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0,0,0,0,1);
timer.Tick += generateButtons;
timer.IsEnabled = true;
}
public void generateButtons(object sender, EventArgs e)
{
if(x < width){
if(y < height)
{
Button tileButton = new Button();
tileButton.Content = "Blank";
tileButton.Name = "Tile_" + x.ToString() + "_" + y.ToString();
tileButton.Width = 15;
tileButton.Height = 15;
Canvas.SetLeft(tileButton, x*15);
Canvas.SetTop(tileButton, y*15);
this.world.Children.Add(tileButton);
done++;
}
x++;
}
else
{
x = 0;
y++;
}
this.progress.Value = ((float)done/(float)toDo)*100;
}
}
Есть ли более быстрый способ делать то, что я делаю? Думая об этом, напишите это, было бы проще создать элемент Canvas в коде, заполнить его кнопками, а затем добавить все это в основную сетку окон? Я понятия не имею, с чего начать это делать, или, если это будет эффективно, улучшите производительность.
Помните, что это для доказательства концепции (поэтому минимально жизнеспособного продукта), оно не обязательно должно быть изящным решением, оно просто должно быть быстрым.
Сделайте несколько заставки, которые ждут, пока все «кнопки» не будут загружены в фоновом режиме? – kevintjuh93
Асинхронный подход позволил бы сохранить восприимчивость холста, поддерживая скорость. – Mathias
@ Mathias - это не то, что использует 'DispatcherTimer'? Или есть какой-то другой метод для этого? –