2

我想本地化我在 app.xaml 中制作的应用栏,但是当我尝试绑定栏项目的文本时,它说文本不能为空,我尝试了其他本地化应用栏示例,但没有一个适用于可以在所有页面上使用的应用栏..

4

3 回答 3

7

App.xaml您可以使用一些 fake声明一个全局应用栏Text,例如:

<Application
    x:Class="PhoneApp1.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone">

    <!--Application Resources-->
    <Application.Resources>
        <local:LocalizedStrings xmlns:local="clr-namespace:PhoneApp1" x:Key="LocalizedStrings"/>
        <shell:ApplicationBar x:Key="GlobalAppBar">
            <shell:ApplicationBarIconButton Text="TEST" IconUri="/Assets/check.png"/>
        </shell:ApplicationBar>
    </Application.Resources>

    <Application.ApplicationLifetimeObjects>
        <!--Required object that handles lifetime events for the application-->
        <shell:PhoneApplicationService
            Launching="Application_Launching" Closing="Application_Closing"
            Activated="Application_Activated" Deactivated="Application_Deactivated"/>
    </Application.ApplicationLifetimeObjects>

</Application>

App.xaml.cs应用本地化:

    var appBar = App.Current.Resources["GlobalAppBar"] as ApplicationBar;
    ((ApplicationBarIconButton) appBar.Buttons[0]).Text = AppResources.AppBarButtonText;

AppBar现在您可以在 中的任何地方使用全局App,只需在 a 后面的代码中进行初始化PhoneApplicationPage

public MainPage()
{
    InitializeComponent();
    ApplicationBar = App.Current.Resources["GlobalAppBar"] as ApplicationBar;
}
于 2013-07-15T11:03:20.167 回答
3

您收到的错误来自 ApplicationBar 不是 DependencyObject 因此它不支持绑定的事实。一个常见的替代方法是使用带有 DependencyProperties 的自定义 AppBar,最值得注意的是BindableApplicationBar ..

<bar:BindableApplicationBarButton
    Text="{Binding IconButtonText}"
    IconUri="{Binding IconUri, FallbackValue=/Icons/Dark/appbar.add.rest.png}"
    IsEnabled="{Binding ButtonIsEnabled}" />

CaliburnBindableAppBar

<bab:BindableAppBarButton
    x:Name="Add"
    Text="{Binding AddButtonText}"
    Visibility="{Binding ShowAddButton, Converter={StaticResource BooleanToVisibilityConverter}}"
    IconUri="{Binding ButtonIconUri}"/>

(来自文档的 .xaml 示例)

于 2013-07-18T06:59:45.867 回答
2

或者您可以按照默认 VS 模板建议的方式进行操作:

  1. 将以下代码添加到页面的 XAML(他们说是最后一个元素,但我不确定这是否重要)

  2. 在后面的代码中创建一个私有方法来添加和数据绑定菜单项,并从构造函数(或您正在调用的任何地方InitializeComponent)调用它:

XAML:

<phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True" Mode="Minimized" />
</phone:PhoneApplicationPage.ApplicationBar>

后面的 C# 代码:

private void BuildLocalizedApplicationBar()
{
    // Create a new menu item with the localized string from AppResources.
    ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.AboutMenuItem);
    ApplicationBar.MenuItems.Add(appBarMenuItem);
}

仍然不是一个理想的解决方案,但可能比仅仅因为这样一个微不足道的原因而引用非本地组件更好。

一些官方参考资料的组合可能有助于作为解决问题的参考资料:

于 2013-11-10T22:23:37.333 回答