【问题标题】:Binding random colors to items of listbox将随机颜色绑定到列表框的项目
【发布时间】:2014-06-06 10:02:02
【问题描述】:

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

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>

做完这一切后,我得到了这样的结果-

重新启动应用后,我得到了这个

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 你能分享一下你调用代码将颜色绑定到列表框的代码吗?我相信问题出在那儿
  • 绑定发生在 XAML 中(如上所示)。我是 Windows Phone 开发的菜鸟。
  • 您能发布您要绑定的资源“colorgenerate”吗?
  • @Code4A 你真的需要读一本书或一些关于 WP、XAML、MVVM 和绑定的教程。如果您打算进行更多的 WP/WPF 开发,这些事情都非常重要。我认为这是重要的教训。 :)
  • @yasen 好吧,今年夏天我将接受 C# 和 ASP.Net 方面的培训。在那之后,我一定会尝试 MVVM。我听说过很多。

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


【解决方案1】:

关键是只有在创建类 RandomColorGenerator 时才会生成 RabdomBrush。

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

public class RandomColorGenerator
{
  public Color randomBrush { 

    get {return generateRandomColor(); }

}
....

【讨论】:

  • 这完全是关于绑定随机颜色。在这种方法中,有时我会为连续的矩形获得相同的颜色(这对于随机生成颜色很明显)。我怎样才能实现这样的事情(第二个屏幕截图)-Poki App Screeshot 它有不同颜色的环,没有连续的环具有相同的颜色。
  • 好吧,改变你的 generateRandomColor() 方法。将已生成的随机值保存在列表中。并且在每次下一次随机检查新值时使用列表来了解您是否已经有这种颜色。
  • 我会试试的。非常感谢。
  • @Code4A 如何只存储要返回的颜色的索引,每次返回颜色时,增加索引。这将是一个循环,不是完全随机的,但这是一个问题吗?您当然可以将开头的数字打乱,使其更加随机。
【解决方案2】:

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

您的列表框 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;

希望对你有帮助

【讨论】:

  • 在这种方法中,有时我会为连续的矩形获得相同的颜色(这对于随机生成颜色很明显)。我怎样才能实现这样的事情(第二个屏幕截图)-Poki App Screeshot 它有不同颜色的环,没有连续的环具有相同的颜色。
  • 看我的回答,不要重复
【解决方案3】:

对于您不重复的问题,我已经更新了您的课程,请参阅下面的课程。现在你的颜色不会重复了。但请确保不要添加超过 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]);
    }
}

希望对你有帮助

【讨论】:

  • 我认为你把事情复杂化了。为什么不直接遍历它们......如果你需要它们是随机的,当你到达终点时将它们随机播放并重置。
【解决方案4】:

您可能需要将一组颜色分配给 ListBox,如下面的代码 sn-p 中所示:

在 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();
}

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

【讨论】:

  • 对不起,我不知道如何使用 MVVM 并且我的项目中没有 ViewModel。
  • 使用 WPF 很简单,很有帮助,让我发布 ViewModel 示例也可以让您轻松完成所需的工作。
  • 对不起,我得到了答案。我一定会按照你的方式尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多