0

リストピッカーをフルスクリーンモードにしたい。しかし、それは私の問題ではありません。Windows Phone の [設定] ページにある "テーマの色" 選択リスト ピッカーとまったく同じように、データ バインディングを備えたリスト ピッカーが必要です。リストピッカーには、色で塗りつぶされた正方形と、色の名前が必要です。バインディングを使用して色名のリストを取得する方法は知っていますが、<Rectangle>内のタグが機能し<DataTemplate>ていません。

これは Listpicker の XAML です

       <toolkit:ListPicker x:Name="lpkColor" Grid.Column="1" ExpansionMode="FullScreenOnly"  Margin="8,12,-8,20" FullModeHeader="Select Color" Header="Color">
            <toolkit:ListPicker.FullModeItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Rectangle Height="50" Width="50" VerticalAlignment="Center" Fill="{Binding color}" Margin="5,30,20,20"></Rectangle>
                        <TextBlock Text="{Binding ColorName}" VerticalAlignment="Center" FontSize="40"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </toolkit:ListPicker.FullModeItemTemplate>
        </toolkit:ListPicker>

コードビハインドは次のようになります。

   public class PickerObject
    {


        public string ColorName { get; set; }
        public Color color{get;set;}
        public PickerObject(string cn, Color c)
        {
            ColorName = cn;
            color = c;
        }



    }

そして私の MainPage クラスの中で

List<PickerObject> MyColors = new List<PickerObject>();

私のコンストラクターの中に私は持っています:

        MyColors = new List<PickerObject>();
        MyColors.Add(new PickerObject("white",Colors.White));
        MyColors.Add(new PickerObject("black", Colors.Black));
        MyColors.Add(new PickerObject("blue", Colors.Blue));
        MyColors.Add(new PickerObject("yellow", Colors.Yellow));
        MyColors.Add(new PickerObject("red", Colors.Red));
        lpkColor.ItemsSource = MyColors ;

しかし、Listpicker には Rectangle が表示されておらず、色も表示されていません。私が間違っていることと、それを正しく行う方法を知りたいです。

4

1 に答える 1

3

これはうまくいかないということですか?

<ListPicker.FullModeItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <Rectangle Margin="0,0,24,0
                       Width="50"
                       Height="50"
                       Fill="Red"/>
            <TextBlock Text="Red"/>
        </StackPanel>
    </DataTemplate>
</ListPicker.FullModeItemTemplate>

または別のマークアップがありますか?


更新:解決策になりました

Fill長方形のプロパティをColor型にバインドするだけではありません。プロパティはここで言うタイプだ
からです。FillBrush

マークアップを拡張できます:

<Rectangle Width="50"
           Height="50">
    <Rectangle.Fill>
        <SolidColorBrush Color="{Binding color}"/>
    </Rectangle.Fill>
</Rectangle>


または、Color-To-Brush コンバーターを実装することもできます。このような:

コード ビハインドにこれを含めます。

using System.Windows.Data;
using System.Globalization;

public class ColorToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        if (value is Color)
            return new SolidColorBrush((Color)value);
        return value;
    }

    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        return null;
    }
}

次に、XAMLこの分離コードの名前空間を含めます。何かのようなもの:

xmlns:local="clr-namespace:YourNamespaceForConverterClass"

また、 Converterクラスと名前付きx:Keyプロパティを参照して、マークアップにローカル リソース ディクショナリを含めます。

<phone:PhoneApplicationPage.Resources>
    <local:ColorToBrushConverter x:Key="convertColorToBrush"/>
</phone:PhoneApplicationPage.Resources>

最後に、コンバーターをその名前Rectangleでアドレス指定に使用できます。x:Key

<Rectangle Width="50"
           Height="50"
           Fill="{Binding color,
                  Converter={StaticResource convertColorToBrush}}"/>


変換を頻繁に使用する予定がある場合は、Converterクラスをアプリケーション リソース ディクショナリ ( App.xamlファイル) に配置すると、繰り返しマークアップを拡張する必要がなくなり、時間を節約できます。

しかし、私が思うBrushのではなく、直接使用する方が良いでしょう。Color

于 2012-08-17T17:42:47.120 に答える