带有本地化字符串的 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>
所以我面临的问题是我不知道如何让<sys:String>Choose</sys:String>
在我的 AppResources.resx 中查找字符串。我试过这个:
<toolkit:ListPickerItem Content="Binding Path=LocalizedResources.chooseClub, Source=StaticResource LocalizedStrings"/>
而不是<sys:string>
,但这会使我的应用程序崩溃。我搜索了谷歌,这是我能找到的唯一可能的解决方案。任何人都可以帮助我?将不胜感激。
编辑 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<string>
然后我可以从我的视图模型 LstItems[PivotSelectedIndex].Data = new ObservableCollection<string>(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<string>
,并将其绑定为:
<toolkit:ListPicker ItemsSource="Binding Items" ...
在这种情况下,ExpansionMode="FullScreen"
就像一个魅力,不要问我为什么......
如果您真的想坚持使用 XAML 代码中声明的项目列表,则必须以某种方式摆脱 ExpansionMode
属性。过去您可以使用ItemCountThreshold
属性:此属性控制选择器是否以全屏模式打开(如果它包含的项目多于ItemCountThreshold
指定的项目) - 将其设置为0 以强制全屏模式。不幸的是,当前的 Toolkit 版本不再支持此属性,this similar question 中讨论的解决方法也不适用于我。
【讨论】:
按照@KasunKV 的建议设置来自代码隐藏的项目也可能是一种替代解决方案,具体取决于您是否更喜欢视图模型代码或代码隐藏中的项目列表... 删除 ExpansionMode 无效。它仍然崩溃 您是否在 C# 中设置了列表?即使在那之后它仍然崩溃吗? 只是为了验证它是否是一个本地化问题:用硬编码字符串值替换所有与 LocalizedResources 的绑定时是否有效? 当我只使用静态试试这个..有两种方法..你只能使用 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# 中显示 – 带有笑脸的文本(笑脸看起来像 –。)
带有 .resx 资源的 Windows Phone 8.1 上的 MissingManifestResourceException
是否可以在 Windows Phone 8.1 中本地化推送通知文本