Brush
コレクション(Aqua、Azure、... Black、...)でランダムなBrushes
を選択する方法を探しています。どんな手掛かり?
次のように、少し反射を使用できます。
private Brush PickBrush()
{
Brush result = Brushes.Transparent;
Random rnd = new Random();
Type brushesType = typeof(Brushes);
PropertyInfo[] properties = brushesType.GetProperties();
int random = rnd.Next(properties.Length);
result = (Brush)properties[random].GetValue(null, null);
return result;
}
それでうまくいきます。私の例のように、メソッドが呼び出されるたびに新しいシードを再作成するのではなく、外部のRandom
インスタンスを使用するようにランダム化を変更することをお勧めします。
単にランダムな色、任意のランダムな色が必要な場合は、Random
オブジェクトを使用して、0〜255の(a)rgb値を生成します。
名前付きの色(ブラシ)が実際に必要な場合は、事前定義されたすべての値をルックアップテーブルに格納し、それにランダムにインデックスを生成できます。 Brushes
は(「列挙型」ではなく)クラスであるため、静的プロパティをランダムにフェッチするのは少し難しいですが、リフレクションを使用してそれを行うことができます。リフレクションを介してすべてのプロパティ名をルックアップテーブルに格納してから、もう一度リフレクションを使用して、格納されている名前に対応するプロパティの値を取得します。
private List<Brush> _brushes;
private void InitBrushes()
{
_brushes = new List<Brush>();
var props = typeof(Brushes).GetProperties( BindingFlags.Public | BindingFlags.Static );
foreach( var propInfo in props )
{
_brushes.Add( (Brush)propInfo.GetValue( null, null ) );
}
}
そして、ランダムなブラシを取得するには...
private Random _Rand = new Random();
private Brush GetRandomBrush()
{
return _brushes[_Rand.Next(_brushes.Count)];
}
ここでエラーが発生しなかったことを願っています。電話を使用していてテストできませんが、一般的な考え方は理解できます。
Brushes
はコレクションではなく、多くの静的プロパティを持つクラスです。リフレクションを使用して静的プロパティを選択することもできますが、必要なブラシを使用して配列を作成することをお勧めします。
Brush[] brushes = new Brush[] {
Brushes.AliceBlue,
Brushes.AntiqueWhite,
Brushes.Aqua,
...
Brushes.YellowGreen
};
次に、ランダムに1つを簡単に選択できます。
Random rnd = new Random();
Brush brush = brushes[rnd.Next(brushes.Length)];
Random Rand = new Random();
Brush brush = new SolidColorBrush(Color.FromRgb((byte) Rand.Next(0, 256), (byte) Rand.Next(0, 256), (byte) Rand.Next(0, 256)));
これは機能するはずです:
Brush RandomBrush()
{
PropertyInfo[] brushInfo = typeof(Brushes).GetProperties();
Brush[] brushList = new Brush[brushInfo.Length];
for(int i = 0;i < brushInfo.Length;i++)
{
brushList[i] = (Brush)brushInfo[i].GetValue(null, null);
}
Random randomNumber = new Random(DateTime.Now.Second);
return brushList[randomNumber.Next(1, brushList.Length)];
}
WPFのデフォルトのブラシを取得するには:
var brushes = typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static).Select(pi => (Brush)pi.GetValue(null, null));
ランダムな色を返すユーティリティメソッドを以下に追加しました。
public static Brush getRandomBrush()
{
string[] brushArray = typeof(Brushes).GetProperties().
Select(c => c.Name).ToArray();
Random randomGen = new Random();
string randomColorName = brushArray[randomGen.Next(brushArray.Length)];
SolidColorBrush color = (SolidColorBrush)new BrushConverter().ConvertFromString(randomColorName);
return color;
}