带有本地化字符串的 Windows Phone 中的 ListPicker

Posted

技术标签:

【中文标题】带有本地化字符串的 Windows Phone 中的 ListPicker【英文标题】:ListPicker in windows phone with localization strings 【发布时间】:2014-09-28 05:09:54 【问题描述】:

我在我的 Windows Phone 8 项目中使用 Toolkit ListPicker 并已开始对其进行本地化。我遇到了一个问题,因为我不知道如何使用 ListPicker 来做到这一点。

<toolkit:ListPicker x:Name="lstClubsPick" 
                    FontSize="30" 
                    Grid.Column="1"  
                    VerticalAlignment="Center" 
                    SelectionMode="Single"
                    HorizontalAlignment="Center"  
                    SelectedIndex="Binding KolleSelectedIndex, Mode=TwoWay"
                    CacheMode="BitmapCache" 
                    ExpansionMode="FullScreenOnly" >

<toolkit:ListPickerItem Content="Binding Path=LocalizedResources.chooseClub, Source=StaticResource LocalizedStrings"/>
<sys:String>Choose</sys:String>
<sys:String>D1</sys:String>
<sys:String>D2</sys:String>
<sys:String>D3</sys:String>
<sys:String>D4</sys:String>
<i:Interaction.Triggers>
    <i:EventTrigger EventName="Tap">
        <cal:ActionMessage MethodName="ClubClicked">
            <cal:Parameter Value="Binding ElementName=lstPivot,Path=SelectedItem, Mode=TwoWay"></cal:Parameter>
            <cal:Parameter Value="Binding ElementName=lstClubsPick,Path=SelectedItem, Mode=TwoWay"></cal:Parameter>
        </cal:ActionMessage>
    </i:EventTrigger>
</i:Interaction.Triggers>

所以我面临的问题是我不知道如何让&lt;sys:String&gt;Choose&lt;/sys:String&gt; 在我的 AppResources.resx 中查找字符串。我试过这个:

<toolkit:ListPickerItem Content="Binding Path=LocalizedResources.chooseClub, Source=StaticResource LocalizedStrings"/>

而不是&lt;sys:string&gt;,但这会使我的应用程序崩溃。我搜索了谷歌,这是我能找到的唯一可能的解决方案。任何人都可以帮助我?将不胜感激。

编辑 1:所以我已经使用 andreask 的解决方案更新了我的代码,但是我的 ListPicker 没有响应我在 viewModel 中添加的字符串。

private ObservableCollection<string> _data;

public ObservableCollection<string> Data

    get
    
        return _data;
    
    set  
        _data = value; 
        NotifyOfPropertyChange(() => Data); 
    


Data = new ObservableCollection<string>();
Data.Add("Test");

<toolkit:ListPicker x:Name="lstClubsPick" FontSize="30" Grid.Column="1"  VerticalAlignment="Center" SelectionMode="Single" HorizontalAlignment="Center" ItemsSource="Binding Data" SelectedIndex="Binding KolleSelectedIndex, Mode=TwoWay" CacheMode="BitmapCache" ExpansionMode="FullScreenOnly">

我做错了什么?

编辑 2:非常感谢您的回答,您肯定为我指明了正确的方向。我找到了解决我的问题的方法,我绑定了我的 Pivot 视图的 ItemsSource,然后我可以在我的视图模型中添加一个 ObservableCollection&lt;string&gt; 然后我可以从我的视图模型 LstItems[PivotSelectedIndex].Data = new ObservableCollection&lt;string&gt;(items); 再次运行此代码,其中 items 是一个字符串数组。所以在我的字符串数组中,我可以使用带有AppResources.YourResourceName 的应用程序资源创建一个字符串。

【问题讨论】:

【参考方案1】:

您可以在代码中设置项目,在 XAML 中有您的正常 ListPicker 像这样。

<toolkit:ListPicker x:Name="lstClubsPick" 
                    FontSize="30" 
                    Grid.Column="1"  
                    VerticalAlignment="Center" 
                    SelectionMode="Single"
                    HorizontalAlignment="Center"                                   
                    CacheMode="BitmapCache" 
                    SelectedIndex="Binding KolleSelectedIndex, Mode=TwoWay"
                    ExpansionMode="FullScreenOnly" />

然后在 C# 代码中创建一个 List 并像这样将本地化字符串添加到其中。并将列表设置为 ListPicker 的 ItemsSource。

public MainPage()

    InitializeComponent();

    List<string> items = new List<string>();
    items.Add(AppResources.OptionOne);
    items.Add(AppResources.OptionTwo);
    items.Add(AppResources.OptionThree);
    items.Add(AppResources.OptionFour);
    items.Add(AppResources.OptionFive);

    lstClubsPick.ItemsSource = items;

你应该很高兴。希望对你有帮助

【讨论】:

据我所知,找不到 lstClubsPick 是因为它在 DataTemplate 中。 我不明白,您的 ListPicker 是否在 DataTemplate 中?因为,如果不是,你肯定能找到它。您能否至少在 ContentPanel 网格中使用更多的 XAML 更新问题,以便我可以清楚地看到。因为我给你的代码已经过测试并且可以工作.. 我已经用有效的解决方案编辑了我的问题。感谢您为我指明正确方向的帮助。【参考方案2】:

我认为这不是本地化问题,而是ListPicker 本身的问题。我根据经验知道,在 XAML 中指定列表项时,将 ExpansionMode 设置为 FullScreen 不起作用。尝试从ListPicker 声明中删除ExpansionMode 属性,它现在可以工作了吗?

如果是,恐怕您唯一的选择是在您的视图模型中声明项目列表,例如为ObservableCollection&lt;string&gt;,并将其绑定为:

    <toolkit:ListPicker ItemsSource="Binding Items" ...

在这种情况下,ExpansionMode="FullScreen" 就像一个魅力,不要问我为什么......

如果您真的想坚持使用 XAML 代码中声明的项目列表,则必须以某种方式摆脱 ExpansionMode 属性。过去您可以使用ItemCountThreshold 属性:此属性控制选择器是否以全屏模式打开(如果它包含的项目多于ItemCountThreshold 指定的项目) - 将其设置为0 以强制全屏模式。不幸的是,当前的 Toolkit 版本不再支持此属性,this similar question 中讨论的解决方法也不适用于我。

【讨论】:

按照@KasunKV 的建议设置来自代码隐藏的项目也可能是一种替代解决方案,具体取决于您是否更喜欢视图模型代码或代码隐藏中的项目列表... 删除 ExpansionMode 无效。它仍然崩溃 您是否在 C# 中设置了列表?即使在那之后它仍然崩溃吗? 只是为了验证它是否是一个本地化问题:用硬编码字符串值替换所有与 LocalizedResources 的绑定时是否有效? 当我只使用静态 时它有效(并且一直有效)。当我尝试对其进行本地化时,就会产生问题。但我需要它本地化,因为这是一个非常大的应用程序,当我有 30k 行代码时,对项目进行编码真的不是一个选择。【参考方案3】:

试试这个..有两种方法..你只能使用 xaml 来做到这一点,如下面的代码..

<toolkit:ListPicker x:Name="listStatic" Grid.Row="1"  VerticalAlignment="Top"                          HorizontalAlignment="Stretch" FullModeHeader="Choose the Mode">
                    <system:String>abc</system:String>
                    <system:String>abc</system:String>
                    <system:String>abc</system:String>
                    <system:String>abc</system:String>
                    <system:String>abc</system:String>
                    <system:String>abc</system:String>
  </toolkit:ListPicker>

或者您可以同时使用 xaml 和 c#,如下所示。 将此添加到您的 .cs 文件中..

 private List<string> SetData()
        
            List<string> data = new List<string>();
            data.Add("abc");
            data.Add("abc");
            data.Add("abc");
            data.Add("abc");
            data.Add("abc");
            data.Add("abc");
            data.Add("abc");


            return data;            
        

将此添加到 main 方法..

public MainPage()
        
            InitializeComponent();

            listDynamic.ItemsSource = SetData();

        

然后将以下内容添加到 xaml 文件中..

 <toolkit:ListPicker x:Name="listDynamic" Grid.Row="1"  VerticalAlignment="Top" HorizontalAlignment="Stretch" FullModeHeader="Choose the Mode">
                    <toolkit:ListPicker.FullModeItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Margin="6,12,6,12">
                                <Rectangle Fill="Green" Height="24" Width="24" />
                                <TextBlock Text="Binding" Margin="12,0,0,0" FontSize="StaticResource PhoneFontSizeLarge" />
                            </StackPanel>
                        </DataTemplate>
                    </toolkit:ListPicker.FullModeItemTemplate>
                </toolkit:ListPicker>

这很好用..希望这对你有帮助..

【讨论】:

我已经用有效的解决方案编辑了我的问题。感谢您为我指明正确方向的帮助。

以上是关于带有本地化字符串的 Windows Phone 中的 ListPicker的主要内容,如果未能解决你的问题,请参考以下文章

在 windows phone 8.1 C# 中显示 &#8211 带有笑脸的文本(笑脸看起来像 &#8211。)

带有 .resx 资源的 Windows Phone 8.1 上的 MissingManifestResourceException

是否可以在 Windows Phone 8.1 中本地化推送通知文本

带有 AngularJS 的 Windows Phone 全景图

带有地图控制 Windows Phone 的内容对话框

发送带有证书的 Windows Phone 推送通知?