1

Windows8ストアアプリを開発しています。動的にデータを入力するグリッドがあります

<Grid Grid.Column="1" Margin="0,16,0,0" HorizontalAlignment="Left" VerticalAlignment="Center">
                <GridView x:Name="chapterlist" HorizontalAlignment="Left" VerticalAlignment="Top" Width="auto" ItemClick="onChapterClick" Padding="0" Height="600" Margin="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
                    <GridView.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Width="260" Height="80" Background="{Binding RelativeSource={RelativeSource Self}, Path=alreadyDownload, Converter={StaticResource ColorConverter}}">                                    
                                <TextBlock x:Name ="AAA" Text="{Binding Path=Chapter}" FontSize="10" Foreground="White" d:LayoutOverrides="Width" Margin="5" TextWrapping="Wrap" />
                                <TextBlock Text="{Binding Path=Name}" Foreground="White" d:LayoutOverrides="Width" TextWrapping="Wrap"/>
                                <TextBlock Text="{Binding Path=alreadyDownload}" Foreground="#073363" VerticalAlignment="Bottom"  HorizontalAlignment="Right" Margin="0,18,2,2" FontSize="10" d:LayoutOverrides="Width" TextWrapping="Wrap"/>
                            </StackPanel>
                        </DataTemplate>
                    </GridView.ItemTemplate>
                </GridView>
            </Grid>

したがって、TextBlock の値に応じて StackPanel の背景色を変更する必要があります。

<TextBlock Text="{Binding Path=alreadyDownload}" Foreground="#073363" VerticalAlignment="Bottom"  HorizontalAlignment="Right" Margin="0,18,2,2" FontSize="10" d:LayoutOverrides="Width" TextWrapping="Wrap"/>

ColorConverter を次のように使用しました

class ColorConverter : IValueConverter
{
    public object Convert(object value, System.Type targetType, object parameter, String culture)
    {
        if (value != null)
        {
            if (value.Equals("Already Downloaded "))
                return Colors.Red;
            else
                return Colors.White;
        }

        return Colors.White;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

しかし、私のグリッドは背景色を反映していません(実際には色がまったくなく、透明です)。なぜそれが起こっているのですか? どうすればこの問題を解決できますか? 参考までに画像を添付します。前もって感謝します ここに画像の説明を入力

したがって、私が望むのは、既にダウンロードされたテキストを含むグリッドを別の色で表示し、残りのグリッドを別の色で表示することです。

4

3 に答える 3

1

上記のシーンを行うには 2 つの方法があります

1) ObservableCollection に入力するオブジェクトに Background プロパティを追加し、xaml でバインディングを使用できます。

<Grid Width="200" Background="{Binding Background}" />

このようにして、グリッド内のすべての項目の色を選択し、オブジェクト プロパティを変更するだけで動的に変更できます。ここで Background プロパティは、次のような有効な色が割り当てられた文字列でなければなりません

object.Background = "White"

2)Converter(私が使用したように)を使用して、オブジェクト内の既存のプロパティを色に変換します(私の Converter クラスを参照してください)。ここで使用したようなプロパティを使用してバインドすることもできます

<TextBlock Text="{Binding Path=alreadyDownload}"

次のようになります

<StackPanel Width="260" Height="80" Background="{Binding RelativeSource={RelativeSource Self}, Path=alreadyDownload, Converter={StaticResource ColorConverter}}">                                    
                            <TextBlock x:Name ="AAA" Text="{Binding Path=Chapter}" FontSize="10" Foreground="White" d:LayoutOverrides="Width" Margin="5" TextWrapping="Wrap" />
                            <TextBlock Text="{Binding Path=Name}" Foreground="White" d:LayoutOverrides="Width" TextWrapping="Wrap"/>
                            <TextBlock Text="{Binding Path=alreadyDownload}" Foreground="#073363" VerticalAlignment="Bottom"  HorizontalAlignment="Right" Margin="0,18,2,2" FontSize="10" d:LayoutOverrides="Width" TextWrapping="Wrap"/>
                        </StackPanel>

では、なぜ私のコードが実行されていないのでしょうか? その理由は、IValueConverter が文字列である必要があるオブジェクトを返すためです。

if (value.Equals("Already Downloaded "))
            return Colors.Red;
        else
            return Colors.White;

使用する

 if (value.Equals("Already Downloaded "))
                return "#FF0000";
            else
                return "#FFFFFF";

そのため、完全に実行されています

于 2013-06-26T09:46:03.213 に答える
0

代わりに次のコードを使用してください。

if (value.Equals("Already Downloaded "))
        return Brushes.Red;
    else
        return Brushes.White;

または、色クラスを使用する場合は、この方法で使用できます。

new SolidColorBrush(Colors.Red)

これで問題が解決することを願っています。

于 2013-06-26T10:17:21.170 に答える
0
if (value.Equals("Already Downloaded "))

Downloadedと "の間のスペースでしょうか?

于 2013-06-26T08:09:08.410 に答える