Maalesef için çok geç partiye olmak! WinRT'de benzer bir sorunla karşılaştım. WPF veya WinRT kullanıp kullanmadığınızdan emin değilim, ancak bazı yönlerden (bazıları diğerlerinden daha iyi) farklıdırlar. İnşallah bu, tahtadaki insanlara, hangi durumda olduklarına yardımcı olur.
Yeniden kullanmak ve C# kod arkasından yapmak için oluşturduğum dönüştürücü sınıfındaki kodu her zaman kullanabilirsiniz. dürüst olmak gerekirse:
Bunu 6 basamaklı (RGB) veya 8 basamaklı (ARGB) Hex değerinin her iki şekilde kullanılabileceği niyetiyle yaptım.
<Grid>
<Rectangle Fill="{Binding RectangleColour,
Converter={StaticResource StringToSolidColorBrushConverter}}"
Height="20" Width="20" />
</Grid>
bir Works:
public class StringToSolidColorBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
var hexString = (value as string).Replace("#", "");
if (string.IsNullOrWhiteSpace(hexString)) throw new FormatException();
if (hexString.Length != 6 || hexString.Length != 8) throw new FormatException();
try
{
var a = hexString.Length == 8 ? hexString.Substring(0, 2) : "255";
var r = hexString.Length == 8 ? hexString.Substring(2, 2) : hexString.Substring(0, 2);
var g = hexString.Length == 8 ? hexString.Substring(4, 2) : hexString.Substring(2, 2);
var b = hexString.Length == 8 ? hexString.Substring(6, 2) : hexString.Substring(4, 2);
return new SolidColorBrush(ColorHelper.FromArgb(
byte.Parse(a, System.Globalization.NumberStyles.HexNumber),
byte.Parse(r, System.Globalization.NumberStyles.HexNumber),
byte.Parse(g, System.Globalization.NumberStyles.HexNumber),
byte.Parse(b, System.Globalization.NumberStyles.HexNumber)));
}
catch
{
throw new FormatException();
}
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
benim App.xaml içine eklendi:
<ResourceDictionary>
...
<converters:StringToSolidColorBrushConverter x:Key="StringToSolidColorBrushConverter" />
...
</ResourceDictionary>
Ve görünümün Xaml kullandı
Bu yüzden bir dönüştürücü sınıfı yarattı çekicilik!
Yan not ... Maalesef WinRT System.Windows.Media.BrushConverter
o H.B. sahip değil önerdi; Bu yüzden başka bir yönteme ihtiyacım vardı, aksi takdirde SolidColorBrush
(veya benzeri) RectangleColour
string özelliğinden dönen bir VM özelliği yapmış olurdum. Bir uzantı oluşturabilir Kolaylık olması açısından
Tek liner yapmak mümkün mü? – heltonbiker
@heltonbiker: Evet, neden olmasın? –
Eh, sonunda 'Fill = (SolidColorBrush) yeni BrushConverter() kullanıyorum. ConvertFromString (" # 76EB7E ");', başka bir SO cevabında bulduğum ve bu cevabı hemen hemen aynı! Güzel! – heltonbiker