Как удалить или скрыть элемент панели инструментов в конкретной ошибке страницы: System.IndexOutOfRangeException: индекс находился за пределами массива
Я пытаюсь Remove()
или Clear()
ToolbarItems
. Вот мой код, где я создаю ToolbarItem
в MainPage.cs
public partial class MainPage : MasterDetailPage
{
public ToolbarItem cCounter = new ToolbarItem() { Icon = "picture.png" };
public ToolbarItem pPo = new ToolbarItem() { Text = "-" };
public MainPage()
{
InitializeComponent();
if (Device.OS == TargetPlatform.iOS)
{
provider.Clicked += iOS_Ppo_Clicked;
ToolbarItems.Add(cCounter);
ToolbarItems.Add(pPo);
}
}
private void iOS_Ppo_Clicked(object sender, EventArgs e)
{
OpenWindow();
}
public async void OpenWindow()
{
if (await Common.WindowComands.CanOpenWindow<PPoPage>(Detail))
{
page = new PPoPage(Page3.Allproviders);
this.ToolbarItems.Clear(); // here I am getting error:Index was outside the bounds of the array
page.OnSelected += Page_OnSelected;
await Detail.Navigation.PushAsync(page, false);
}
}
}
Изменить: когда я включил this.ToolbarItems.Clear();
в OpenWindow
метод, который инициализирует открытие другой страницы и работает! Чистит все элементы панели инструментов, но, к сожалению, показывает эту ошибку:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
Эти элементы должны исчезнуть только для iOS, как вы видите.
Вот мой класс страницы, где мне бы хотелось Remove()
эти ToolbarItems
:
public partial class PPoPage : ContentPage
{
public MainPage main { get; set; }
private List<PPo> Pro;
public PPoPage(List<PPo> po)
{
InitializeComponent();
if (Device.OS == TargetPlatform.iOS)
{
Pro = po;
CreateLayout();
// HERE I WANT TO REMOVE TOOLBARITEMS FOR THIS PAGE
this.ToolbarItem.Remove(main.cCounter); // here there is error
this.ToolbarItems.Clear(); // this also doesn't work, because toolbar items still exist after this initialization.
}
}
}
В этом классе я пробовал оба подхода, но никто не работает. Благодарим вас за ответы или предложения.
Ответы
Ответ 1
Прежде всего, я очень хочу поблагодарить за все ответы и предложения, которые я попытался реализовать как ответы на мое решение, но, к сожалению, безуспешно. Основная причина, по которой я не фокусировался на классе, где я реализовал всю панель инструментов iOS, и это было в моем проекте iOS.
На панели инструментов iOS я просто написал простой оператор if:
var currentPage = ((NavigationPage)Element).CurrentPage;
if (currentPage != null && currentPage is ContentPage)
{
TopViewController.NavigationItem.RightBarButtonItems = new UIBarButtonItem[0];
return;
}
Ответ 2
Проблема здесь в том, что PPoPage
- это другой экземпляр страницы для MainPage
и, следовательно, содержит свою собственную коллекцию ToolbarItems.
Попробуйте main.ToolbarItems.Clear()
вместо this.ToolbarItems.Clear()
, если предполагается, что свойство main
было инициализировано, или вы можете получить доступ к текущей странице верхнего уровня с помощью Xamarin.Forms.NavigationPage.CurrentPage
.
Ответ 3
У меня была задача изменить видимость элемента панели инструментов, и я создал базовую страницу содержимого с оберткой вокруг коллекции ToolbarItems
. Мой образец может помочь вам:
образец на git
некоторый "учебник" , который я опубликовал в CodeReview
![введите описание изображения здесь]()