2011-04-26 8 views
10

Estoy trabajando en una aplicación C# WPF, usando archivos .resx para la gestión de recursos. Ahora, estoy intentando agregar íconos (.ico) al proyecto, pero estoy teniendo algunos problemas.¿Cómo hacer referencia a los iconos dentro de los archivos .resx de xaml?

<Image Name="imgMin" Grid.Column="0" 
     Stretch="UniformToFill" 
     Cursor="Hand" 
     MouseDown="imgMin_MouseDown"> 
    <Image.Style> 
     <Style TargetType="{x:Type Image}"> 
      <Setter Property="Source" Value="\Images\minimize_glow.ico"/> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Source" Value="\Images\minimize_glow.ico"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
</Image> 

Esto funciona bien, pero cuando muevo el icono en AppResources.resx I a tener problemas con referencia a ella en el código XAML. ¿Qué debería estar usando en lugar de las propiedades Setter = ... líneas arriba? Este:

<Setter Property="Source" Value="{x:Static res:AppResources.minimize}"/> 

no funciona, creo que probablemente tendrá que utilizar una propiedad diferente de "Fuente" porque el valor no es una cadena que señala el icono, pero el icono en sí mismo. Sin embargo, no sé cuál usar, ¿alguna ayuda, por favor?

Respuesta

3

La propiedad Source no "quiere" una cadena, solo la convierte cuando recibe una. Si agrega un ícono a los recursos, será del tipo System.Drawing.Icon. Deberá convertirlo a un ImageSource a través del convertidor.

Puede hacer un acceso estático a los recursos, pero debe cumplir con la sintaxis esperada de x:Static.

p. Ej.

xmlns:prop="clr-namespace:Test.Properties" 
<Image MaxHeight="100" MaxWidth="100"> 
    <Image.Source> 
     <Binding Source="{x:Static prop:Resources.icon}"> 
      <Binding.Converter> 
       <vc:IconToImageSourceConverter/> 
      </Binding.Converter> 
     </Binding> 
    </Image.Source> 
</Image> 
public class IconToImageSourceConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var icon = value as System.Drawing.Icon; 
     var bitmap = icon.ToBitmap(); 

     //http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap/1069509#1069509 
     MemoryStream ms = new MemoryStream(); 
     bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
     ms.Position = 0; 
     BitmapImage bi = new BitmapImage(); 
     bi.BeginInit(); 
     bi.StreamSource = ms; 
     bi.EndInit(); 

     return bi; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

Notas: modificador de acceso

  • El recurso debe ser pública
  • Si se añade la imagen como "Imagen" se termina con un Bitmap en lugar de un ícono que requiere un convertidor diferente
+0

Muy útil ... creo. Ahora recibo un error que dice: Error de construcción desconocido, 'La clave no puede ser nula. Nombre del parámetro: clave Línea 131 Posición 34. ' Señalando a enlace Fuente = "{x: Res estático: AppResources.minimize}" – Swooper

+0

Hmm, qué clave me pregunto, no encontré tales problemas ... –

+0

Una cosa que es importante es que el modificador de acceso a recursos es público en lugar de interno, pero eso arroja otra excepción que la que tienes. –

Cuestiones relacionadas