2011-07-24 30 views

cevap

80

Sen aynı XAML okuma sistemi kullanan mekanizma da kullanabilirsiniz: Tür dönüştürücüleri WPF

var converter = new System.Windows.Media.BrushConverter(); 
var brush = (Brush)converter.ConvertFromString("#FFFFFF90"); 
Fill = brush; 
+2

Tek liner yapmak mümkün mü? – heltonbiker

+0

@heltonbiker: Evet, neden olmasın? –

+7

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

24

kodunda, açıkça bir Brush örneğini oluşturmak gerekir:

Fill = new SolidColorBrush(Color.FromArgb(0xff, 0xff, 0x90)) 
+0

.Başka bir thre renklerim var –

+0

Altıgen renkler, üç adet 2 basamaklı onaltılık sayıdan ('R',' G' ve 'B'), artı gelen isteğe bağlı bir 'Alfa'dan (saydamlık) oluşur. Bu numaraları 'FromArgb' – SLaks

+0

renk kodunuzu ikiye gruplara ayırmanız gerekiyor. Sonra onu son üç kullandığını göreceksin. – Sascha

-2

hangi sürümü kullanıyor musun? Hem 3.5 hem de 4.0'da denedim ve Fill = "# FF000000" XAML'de iyi çalışmalı. Bununla birlikte, başka bir sözdizimi vardır. İşte iki farklı yolla test ettiğim 3.5 XAML. Daha iyisi bir kaynak kullanmak olacaktır.

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Rectangle Height="100" HorizontalAlignment="Left" Margin="100,12,0,0" Name="rectangle1" Stroke="Black" VerticalAlignment="Top" Width="200" Fill="#FF00AE00" /> 
    <Rectangle Height="100" HorizontalAlignment="Left" Margin="100,132,0,0" Name="rectangle2" Stroke="Black" VerticalAlignment="Top" Width="200" > 
     <Rectangle.Fill> 
      <SolidColorBrush Color="#FF00AE00" /> 
     </Rectangle.Fill> 
    </Rectangle> 
</Grid> 

+0

O arkadaki kod hakkında konuşuyor ... –

+0

Haklısın, ahh. Geçiş kapağını uzat, teşekkürler. – wilbur4321

2

WinRT (Windows Mağazası Uygulama)

using Windows.UI; 
using Windows.UI.Xaml.Media; 

    public static Brush ColorToBrush(string color) // color = "#E7E44D" 
    { 
     color = color.Replace("#", ""); 
     if (color.Length == 6) 
     { 
      return new SolidColorBrush(ColorHelper.FromArgb(255, 
       byte.Parse(color.Substring(0, 2), System.Globalization.NumberStyles.HexNumber), 
       byte.Parse(color.Substring(2, 2), System.Globalization.NumberStyles.HexNumber), 
       byte.Parse(color.Substring(4, 2), System.Globalization.NumberStyles.HexNumber))); 
     } 
     else 
     { 
      return null; 
     } 
    } 
1

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

0

: -

public static SolidColorBrush ToSolidColorBrush(this string hex_code) 
    { 
     return (SolidColorBrush)new BrushConverter().ConvertFromString(hex_code); 
    } 

Ve sonra kullanmak için: - Bu kodu oluşturmak nasıl

SolidColorBrush accentBlue = "#3CACDC".ToSolidColorBrush(); 
İlgili konular