Программное изменение значков панели приложений

В моем приложении C# для Windows Phone 8 у меня есть AppBar. У меня есть два значка на этой панели приложений, один новый значок и один значок редактирования. Я хочу изменить значок редактирования на значок «Назад» при каждом нажатии, а затем обратно на значок редактирования при каждом повторном нажатии. Я пробовал этот код, но получаю исключение nullReferenceException:

    public static Uri addIcon = new Uri("/Assets/AppBar/new.png", UriKind.Relative);
    public static Uri backIcon = new Uri("/Assets/AppBar/back.png", UriKind.Relative);

            //Edit the projects
        if (editMode.Equals(false))
        {
            //EditMode is off, enable edit mode and modify the editprojectMenuButton
            editMode = true;
            editprojectMenuButton.IconUri = backIcon;
            editprojectMenuButton.Text = "finish";
        } else
        {
            //EditMode is on, disable edit mode and modify the editprojectMenubutton
            editMode = false;
            editprojectMenuButton.IconUri = addIcon;
            editprojectMenuButton.Text = "edit";
        }

XAML-код:

    <phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
        <shell:ApplicationBarIconButton x:Name="editprojectMenuButton" IconUri="/Assets/AppBar/edit.png" Text="Edit" Click="editprojectMenuButton_Click"/>
        <shell:ApplicationBarIconButton x:Name="addprojectMenuButton" IconUri="/Assets/AppBar/new.png" Text="Add" Click="addprojectMenuButton_Click"/>
        <shell:ApplicationBar.MenuItems>
            <shell:ApplicationBarMenuItem x:Name="aboutButton" Text="About" Click="aboutButton_Click"/>
            <shell:ApplicationBarMenuItem x:Name="howtoButton" Text="How To" Click="howtoButton_Click"/>
        </shell:ApplicationBar.MenuItems>
    </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

Альтернативный код AppBar:

            //Create the AppBar
        ApplicationBar = new ApplicationBar();
        ApplicationBar.Mode = ApplicationBarMode.Default;
        ApplicationBar.IsMenuEnabled = true;
        addprojectMenuBtn = new ApplicationBarIconButton(new Uri("BarIcons/add.png", UriKind.Relative));
        addprojectMenuBtn.Text = "add";
        addprojectMenuBtn.Click += addprojectMenuButton_Click;

        editprojectMenuBtn = new ApplicationBarIconButton(new Uri("BarIcons/edit.png", UriKind.Relative));
        editprojectMenuBtn.Text = "add";
        editprojectMenuBtn.Click += editprojectMenuButton_Click;

        ApplicationBar.Buttons.Add(addprojectMenuBtn);
        ApplicationBar.Buttons.Add(editprojectMenuBtn);

person Erik    schedule 29.11.2013    source источник
comment
Можете ли вы показать еще немного кода? Я думаю, что, вероятно, ваша кнопка является локальной переменной, поэтому, когда вы пытаетесь изменить ее позже (например, из метода), вы получаете исключение NullReference.   -  person Romasz    schedule 30.11.2013
comment
Я не знаю, правильно ли я понял ваш вопрос, но я добавил панель приложений в xaml. Я добавил код xaml   -  person Erik    schedule 30.11.2013
comment
В какой строке вы получаете исключение?   -  person Andy    schedule 30.11.2013
comment
На что меняет изображение: editprojectMenuButton.IconUri = backIcon;   -  person Erik    schedule 30.11.2013
comment
У меня та же проблема с кодом, который вы предоставили, кажется, что editprojectMenuButton имеет значение null, даже если оно установлено в xaml. Когда я делаю это программно, у меня нет таких проблем. Думал, что не могу точно сказать, почему метод из xaml дает ноль.   -  person Romasz    schedule 30.11.2013
comment
Вот так странно, почему тогда можно менять TextBlocks, кнопки, TextBox, но не AppBars?   -  person Erik    schedule 30.11.2013


Ответы (1)


Кажется, что когда вы создаете AppBar в xaml, ваша ссылка на кнопку в коде равна нулю.
Я делаю свою AppBar программно и не заметил такой проблемы:

        ApplicationBar = new ApplicationBar();
        ApplicationBar.Mode = ApplicationBarMode.Default;
        ApplicationBar.IsMenuEnabled = false;
        ApplicationBarIconButton addBtn = new ApplicationBarIconButton(new Uri("BarIcons/add.png", UriKind.Relative));
        addBtn.Text = "Add";
        addBtn.Click += addBtn_Click;
        ApplicationBarIconButton infoBtn = new ApplicationBarIconButton(new Uri("BarIcons/info.png", UriKind.Relative));
        infoBtn.Text = "Info";
        infoBtn.Click += infoBtn_Click;
        ApplicationBar.Buttons.Add(addBtn);
        ApplicationBar.Buttons.Add(infoBtn);

Вы также можете добавить туда пункты меню и то, что вы хотите. Затем, если ваша ApplicationBarIconButton является «глобальной» переменной, вы можете изменить ее в любое время, и она работает.

EDIT — некоторые пояснения
Здесь я нашел аналогичную проблему и в этом блоге есть объяснение.

Также есть код, который работает:

 Microsoft.Phone.Shell.ApplicationBarIconButton btn = ApplicationBar.Buttons[0] as Microsoft.Phone.Shell.ApplicationBarIconButton;
 btn.IconUri = backIcon;
 btn.Text = "My button";
person Romasz    schedule 29.11.2013
comment
Я создал панель приложения с кодом, который добавил выше, и поместил ее в общедоступный метод MainPage() перед вызовом метода InitializeComponent(). но он не показывает AppBar - person Erik; 30.11.2013
comment
Вы пробовали после InitializeComponent? Я также добавил метод для доступа к файлам, созданным в xaml. - person Romasz; 30.11.2013
comment
Я пробовал, да, не получилось. Вероятно, просто какая-то крошечная опечатка или что-то в этом роде. Ваш последний код сработал отлично, спасибо! - person Erik; 30.11.2013