2011-07-24 14 views

Respuesta

80

Usted podría utilizar el mismo mecanismo utiliza el sistema de lectura XAML: convertidores de tipos

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

¿Es posible hacerlo de una sola línea? – heltonbiker

+0

@heltonbiker: Sí, ¿por qué no? –

+7

Bueno, al final estoy usando 'Fill = (SolidColorBrush) new BrushConverter(). ConvertFromString (" # 76EB7E ");', que encontré en otra respuesta SO y es bastante idéntica a esta respuesta! ¡Bonito! – heltonbiker

24

En el código, es necesario crear explícitamente un Brush ejemplo:

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

cómo se genera el código.tengo otros tres colores –

+0

Los colores hexadecimales consisten en tres números hexadecimales de 2 dígitos ('R',' G' y 'B'), más un' Alfa' (transparencia) opcional que viene primero. Debe pasar esos números a 'FromArgb' – SLaks

+0

Divida su código de color en grupos de dos. Entonces verás que usó los últimos tres. – Sascha

-2

¿Qué versión de WPF ¿Estas usando? Intenté en 3.5 y 4.0, y Fill = "# FF000000" debería funcionar bien en a en el XAML. Sin embargo, hay otra sintaxis si no es así. Aquí hay un 3.5 XAML que probé con dos formas diferentes. Mejor aún sería usar un recurso.

<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

Habla del código detrás ... –

+0

Tienes razón, duh. Pase el gorro de burro, gracias. – wilbur4321

2

Para WinRT (Windows App Store)

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

Siento ser tan tarde a la fiesta! Me encontré con un problema similar, en WinRT. No estoy seguro de si está usando WPF o WinRT, pero difieren en algunos aspectos (algunos mejores que otros). Espero que esto ayudará a la gente a través del tablero, lo que en la situación en que están.

Siempre se puede usar el código de la clase convertidor I creado para reutilizar y hacer en su C# de código subyacente, o donde quiera que usarlo, para ser honesta:

I hizo con la intención de que un 6 dígitos (RGB), o un valor Hex 8 dígitos (ARGB) se podrían utilizar de cualquier manera.

así que creé una clase de convertidor:

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

Añadido en mi App.xaml:

<ResourceDictionary> 
    ... 
    <converters:StringToSolidColorBrushConverter x:Key="StringToSolidColorBrushConverter" /> 
    ... 
</ResourceDictionary> 

y lo utilizó en mi Ver Xaml:

<Grid> 
    <Rectangle Fill="{Binding RectangleColour, 
       Converter={StaticResource StringToSolidColorBrushConverter}}" 
       Height="20" Width="20" /> 
</Grid> 

trabaja un ¡encanto!

Nota al pie ... Desafortunadamente, WinRT no ha conseguido el System.Windows.Media.BrushConverter que H. B. sugerido; así que necesitaba de otro modo, de lo contrario habría hecho una propiedad que devuelve un VM SolidColorBrush (o similar) de la propiedad RectangleColour cadena.

0

Por simplicidad se puede crear una extensión: -

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

Y después de usar: -

SolidColorBrush accentBlue = "#3CACDC".ToSolidColorBrush(); 
Cuestiones relacionadas