将随机颜色绑定到列表框的项目

时间:2014-06-06 10:02:03

标签: c# xaml windows-phone-8 listbox

我想生成不同的颜色'列表框中的项目。例如 - 每个项目中不同颜色的矩形。我无法这样做。 到目前为止,我已经创建了一个这样的类

public class RandomColorGenerator
{
    public Color randomBrush { get; set; }
    private static Random randomColor = new Random();
    private static uint[] uintColors =
    { 
        0xFF34AADC,0xFFFF2D55,0xFF007AFF,0xFFFF9500,0xFF4CD964,
        0xFFFFCC00,0xFF5856D6,0xFFFF3B30,0xFFFF4981,0xFFFF3A2D
    };

    public RandomColorGenerator()
    {
        randomBrush = generateRandomColor();
    }

    private static Color ConvertColor(uint uintCol)
    {
        byte A = (byte)((uintCol & 0xFF000000) >> 24);
        byte R = (byte)((uintCol & 0x00FF0000) >> 16);
        byte G = (byte)((uintCol & 0x0000FF00) >> 8);
        byte B = (byte)((uintCol & 0x000000FF) >> 0); 
        return Color.FromArgb(A, R, G, B); ;
    }

    public static Color generateRandomColor()
    {
        return ConvertColor(uintColors[randomColor.Next(0, 9)]);
    }
}

和XAML

<ListBox x:Name="TestListBox"  >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Rectangle Margin="10" Height="100" Width="400" >
                <Rectangle.Fill>
                    <SolidColorBrush Color="{Binding randomBrush, 
                                             Source={StaticResource colorgenerate}}">
                    </SolidColorBrush>
                </Rectangle.Fill>
            </Rectangle>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

完成所有这些后,我得到了这样的结果 -

SampleImage1

重新启动应用后,我明白了

SampleImage2

虽然每次运行应用程序时都会出现随机颜色。但是一种颜色适用于所有矩形。

我不知道如何获得理想的结果。 我想要这样的东西 -

enter image description here

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:4)

重点是,只有在创建类RandomColorGenerator时才会生成RabdomBrush。

每次调用时都应该生成新的RandomBrush。有点像这样:

public class RandomColorGenerator
{
  public Color randomBrush { 

    get {return generateRandomColor(); }

}
....

答案 1 :(得分:1)

您的所有代码都已准备就绪。只需在代码中进行这些更改。

您的列表框xaml

<ListBox x:Name="TestListBox">
<ListBox.ItemTemplate>
    <DataTemplate>
        <Rectangle Margin="10" Height="100" Width="400" >
            <Rectangle.Fill>
                <SolidColorBrush Color="{Binding}">
                </SolidColorBrush>
            </Rectangle.Fill>
        </Rectangle>
    </DataTemplate>
</ListBox.ItemTemplate> 

在您的页面构造函数中。添加以下代码

 List<RandomColorGenerator> list = new List<RandomColorGenerator>();
        list.Add(new RandomColorGenerator());
        list.Add(new RandomColorGenerator());
        list.Add(new RandomColorGenerator());
        list.Add(new RandomColorGenerator());
        list.Add(new RandomColorGenerator());
        list.Add(new RandomColorGenerator());
        TestListBox.ItemsSource = list;

希望这有帮助

答案 2 :(得分:1)

对于你的不重复的问题,我已经更新了你的课程,请参阅下面的课程。现在你的颜色不会重复。但请确保您不要添加超过10种颜色。

public class RandomColorGenerator
{
    private static List<int> addedIndex = new List<int>();
    public Color randomBrush { get { return generateRandomColor(); } }
    private static Random randomColor = new Random();
    private static uint[] uintColors =
    { 
        0xFF34AADC,0xFFFF2D55,0xFF007AFF,0xFFFF9500,0xFF4CD964,
        0xFFFFCC00,0xFF5856D6,0xFFFF3B30,0xFFFF4981,0xFFFF3A2D
    };

    private static Color ConvertColor(uint uintCol)
    {
        byte A = (byte)((uintCol & 0xFF000000) >> 24);
        byte R = (byte)((uintCol & 0x00FF0000) >> 16);
        byte G = (byte)((uintCol & 0x0000FF00) >> 8);
        byte B = (byte)((uintCol & 0x000000FF) >> 0);
        return Color.FromArgb(A, R, G, B); ;
    }

    public static Color generateRandomColor()
    {
        int random = randomColor.Next(0, 9);
        if (addedIndex.Count < 9)
        {
            while (addedIndex.Contains(random))
            {
                random = randomColor.Next(0, 9);
            }
            addedIndex.Add(random);
        }
        return ConvertColor(uintColors[random]);
    }
}

希望这会有所帮助

答案 3 :(得分:0)

您可能需要将一组Color分配给ListBox,如下面的代码片段中所示:

在Xaml中:

<ListBox x:Name="TestListBox" ItemSource={Binding ColorList}>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Rectangle Margin="10" Height="100" Width="400" >
                <Rectangle.Fill>
                    <SolidColorBrush Color="{Binding}">
                    </SolidColorBrush>
                </Rectangle.Fill>
            </Rectangle>
        </DataTemplate>
    </ListBox.ItemTemplate> 
</ListBox>

在视图模型中:

public class RandomColorGeneratorViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private List<Color> _colorList;
    public List<Color> ColorList
    {
        get { return _colorList; }
        set { _colorList = value; }
    }
}

在Window / UserControl构造函数中,添加以下行:

public MainWindow()
{
    InitializeComponent();
    this.DataContext = new RandomColorGeneratorViewModel();
}

现在,生成随机颜色的最佳方法是生成整数的红色,绿色,蓝色值,并将它们转换为十六进制并分配给此集合。