У нас есть простое приложение .NET MAUI со страницей входа в качестве главной страницы, и после успешного входа в систему мы переходим на (PushAsync) страницу меню. Все это отлично работает в Android, но когда мы переходим и начинаем тестирование в Windows, мы получаем исключение при попытке выполнить PushAsync на странице меню. Исключением является «Значение не попадает в ожидаемый диапазон». Похоже, он находится в области навигации, поскольку мы можем создать страницу, а затем добавить. Создание страниц работает нормально. Ошибка возникает только тогда, когда мы ее нажимаем.
//MenuPage mp = new MenuPage();
//await Navigation.PushAsync(mp);
await Navigation.PushAsync(new MenuPage());
Обновлять: Код страницы меню ниже. Похоже, что преступником является то, что я вставляю свою сетку в макет вертикального стека. Когда я комментирую эту строку (vsl_menu_holder.Children.Insert(2, Menu_grid)) страница загружается (конечно, без сетки).
public MenuPage()
{
InitializeComponent();
Loaded += MenuPage_Loaded;
Grid menu_grid = Globals.session.dcc_layouts.get_menu_grid(Globals.transactions_list, "User Menu");
set_menu_click_event(menu_grid);
vsl_menu_holder.Children.Insert(2, menu_grid);
}
Get Menu Grid загружает сетку, полную кнопок с изображениями, которая снова отлично работает в Android.
ОБНОВЛЯТЬ:
Я немного углубился в структуру меню, которое представляет собой сетку, полную кнопок с изображениями, и подпись под кнопкой с изображением. Каждый элемент сетки представляет собой вертикальный стек с кнопкой и меткой. Если я закомментирую добавление метки в вертикальный стек, все будет работать нормально??? А нельзя ли это сделать в Windows?
Grid g = new Grid();
for (c = 0; c < rows; c++)
{
RowDefinition rd = new RowDefinition();
rd.Height = GridLength.Auto;
g.RowDefinitions.Add(rd);
}
for (c = 0; c < item_width; c++)
{
ColumnDefinition cd = new ColumnDefinition();
cd.Width = GridLength.Star;
g.ColumnDefinitions.Add(cd);
}
for (y = 0, num = 0; y < rows; y++)
{
for (x = 0; x < item_width; x++, num++)
{
ImageButton button_img = new ImageButton();
button_img.Aspect = Aspect.AspectFit;
button_img.StyleId = "Button" + y + x;
button_img.BorderColor = Colors.Black;
button_img.BorderWidth = 2;
button_img.CornerRadius = 10;
//MENU ICON
button_img.Source = ImageSource.FromFile(Globals.session.icon_dir + "/device_icon_dcc_default_button.png");
button_img.BackgroundColor = Colors.LightGray;
button_img.Padding = 5;
//MENU ITEM CAPTION
Label label_button_title = new Label();
label_button_title.HorizontalOptions = LayoutOptions.Center;
label_button_title.VerticalOptions = LayoutOptions.Start;
label_button_title.Text = "Button" + y + x;
label_button_title.Padding = new Thickness(0, -5, 0, 0);
VerticalStackLayout vsl = new VerticalStackLayout();
vsl.Add(button_img);
//vsl.Add(label_button_title);
g.Add(vsl, x, y);
}
}
заранее спасибо
Лицюнь Шен ... Обновление кода страницы меню. Дай мне знать если тебе нужно что-нибудь еще.
...BTE Лицюнь Шен... с использованием .NET 7
Это связано с известной проблемой на GitHub:Неверные значения отрицательного заполнения #6387. Вы можете попробовать мой обходной путь. Кстати, поддержка .NET7 сейчас прекращена. Мы рекомендуем вам использовать последнюю версию .NET8.
Эта строка вызывает проблему,
label_button_title.Padding = new Thickness(0, -5, 0, 0);
Вы используете отрицательное значение -5, которое приводит к сбою в Windows. Это связано с известной проблемой на GitHub: Неверные значения отрицательного заполнения #6387. Вы можете следить за этой проблемой и получать последние обновления.
Пока что вы можете избегать использования отрицательных значений для платформы Windows. Условная компиляция может вам чем-то помочь,
#if Android
label_button_title.Padding = new Thickness(0, -5, 0, 0);
#elif Windows
label_button_title.Padding = new Thickness(0, 0, 0, 0);
#endif
Надеюсь, поможет!
Ликуин Шен: ИМЕННО то, что было! СПАСИБО!
Могу ли я спросить, какую версию .NET вы используете? И не могли бы вы опубликовать соответствующий код для
MenuPage
?