以编程方式更改应用程序栏图标

5

在我的C# Windows Phone 8应用程序中,我有一个AppBar。这个AppBar上有两个图标,一个新图标和一个编辑图标。我希望在按下编辑图标时将其更改为后退图标,然后再次按下时将其更改回编辑图标。我尝试了这段代码,但是我收到了一个空引用异常:

    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);

你能展示更多的代码吗?我认为你可能把按钮定义成了局部变量,所以当你尝试在稍后的方法中更改它时,会出现NullReference异常。 - Romasz
我不确定我是否正确理解了你的问题,但我已经在XAML中添加了AppBar。我已经添加了XAML代码。 - Erik
你在哪一行代码上遇到了异常? - Andy
更改图像的代码:editprojectMenuButton.IconUri = backIcon; - Erik
我遇到了你提供的代码相同的问题,看起来editprojectMenuButton是null,即使它在xaml中被设置了。当我以编程方式执行时,我没有这样的问题。虽然我不能确定为什么从xaml中的方法会返回null。 - Romasz
这太奇怪了,为什么你可以更改TextBlocks、按钮、TextBoxes,但不能更改AppBars? - Erik
1个回答

2

看起来当你在xaml中创建AppBar时,代码中对Button的引用为空。
我正在以编程方式创建我的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是“全局”变量,您随时可以更改它,并且它会起作用。

编辑 - 一些解释
这里 我找到了类似的问题,在这篇博客中有解释。

这里还有一段代码可以正常运行:
 Microsoft.Phone.Shell.ApplicationBarIconButton btn = ApplicationBar.Buttons[0] as Microsoft.Phone.Shell.ApplicationBarIconButton;
 btn.IconUri = backIcon;
 btn.Text = "My button";

我使用上面添加的代码创建了应用栏,并将其放置在public MainPage()方法中,在调用InitializeComponent()方法之前。但是它没有显示AppBar。 - Erik
你尝试过在InitializeComponent之后吗?我还添加了一个方法来获取在xaml中创建的那些。 - Romasz
我试了,不行。可能只是某个小错别字之类的问题。你上次的代码完美地运行了,谢谢! - Erik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接