【问题标题】:Localization of Application Bar in windows phone 8windows phone 8 中应用程序栏的本地化
【发布时间】:2013-07-15 09:37:55
【问题描述】:

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

【问题讨论】:

    标签: c# xaml windows-phone-8 windows-phone


    【解决方案1】:

    您可以在App.xaml 中声明一个全局应用栏,并带有一些假的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;
    

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

    public MainPage()
    {
        InitializeComponent();
        ApplicationBar = App.Current.Resources["GlobalAppBar"] as ApplicationBar;
    }
    

    【讨论】:

      【解决方案2】:

      您遇到的错误来自 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 示例)

      【讨论】:

      • 感谢您的回答,但我已经按照上述答案解决了这个问题...
      • @SandeepChauhan 我很清楚,答案已被接受 - 其他人可能面临同样的问题,可以使用此解决方案。
      【解决方案3】:

      或者你可以按照默认 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);
      }
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-08
        • 2014-08-21
        • 2014-07-18
        相关资源
        最近更新 更多