【问题标题】:ListPicker in windows phone with localization strings带有本地化字符串的 Windows Phone 中的 ListPicker
【发布时间】: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 的应用程序资源创建一个字符串。

【问题讨论】:

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


    【解决方案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>
    

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

    【讨论】:

    • 我已经用有效的解决方案编辑了我的问题。感谢您为我指明正确方向的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多