Estoy tratando de enlazar una lista de objetos personalizados para WPF Imagen como esta:

<Image>
    <Image.Source>
        <BitmapImage UriSource="{Binding Path=ImagePath}" />
    </Image.Source>
</Image>

Pero no funciona. Este es el error que estoy consiguiendo:

«Propiedad » UriSource’ o bienes «StreamSource’ se debe establecer.»

Lo que me estoy perdiendo?

InformationsquelleAutor urini | 2008-08-21

6 Comentarios

  1. 79

    WPF se ha incorporado en los convertidores para ciertos tipos. Si se unen la Imagen del Source propiedad a un string o Uri valor, bajo la campana de WPF se utiliza un ImageSourceConverter para convertir el valor a un ImageSource.

    Así

    <Image Source="{Binding ImageSource}"/>

    funcionaría si la ImageSource propiedad era una representación de cadena de un URI válido para una imagen.

    Usted puede, por supuesto, del rollo de su propio Enlace de convertidor:

    public class ImageConverter : IValueConverter
    {
        public object Convert(
            object value, Type targetType, object parameter, CultureInfo culture)
        {
            return new BitmapImage(new Uri(value.ToString()));
        }
    
        public object ConvertBack(
            object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }

    y utilizarlo como este:

    <Image Source="{Binding ImageSource, Converter={StaticResource ImageConverter}}"/>
    • (En realidad el tipo de convertidor de no crear un BitmapImage, pero otra subclase de ImageSource: BitmapFrameDecode, que es interno.)
    • ¿Cómo convertir de nuevo si quería conservar el cambio de la imagen?
    • Alternativa a un convertidor: Haga que su propiedad sea usted el enlace (aquí: ImageSource) de tipo Uri o BitmapImage y colado por allí. Si usted necesita para hacer frente a posibles null valores (cast fallado etc.) agregar TargetNullValue={x:Null} a su unión.
  2. 20

    Este artículo por Atul Gupta tiene un ejemplo de código que cubre varios escenarios:

    1. De recursos ordinarios de la imagen enlace a la Fuente de la propiedad en XAML
    2. De unión de los recursos de la imagen, pero desde el código detrás de
    3. Unión de recursos de imagen en el código mediante el uso de la Aplicación.GetResourceStream
    4. La carga de la imagen de la ruta de acceso del archivo a través de la secuencia de memoria (lo mismo es aplicable cuando se carga el blog de la imagen en la base de datos)
    5. La carga de la imagen de la ruta de acceso del archivo, pero mediante la unión a una ruta de archivo de Propiedad
    6. Enlace de datos de imagen en un control de usuario que posee internamente el control de imagen a través de la propiedad de dependencia
    7. Mismo como el punto 5, sino también en garantizar que el archivo no quedar bloqueado en el disco duro
    • enlace para el código está roto.
  3. 18

    También puede simplemente establecer el atributo de Origen en lugar de utilizar los elementos secundarios. Para ello la clase necesita para volver a la imagen como una Imagen de mapa de bits. Aquí está un ejemplo de una forma en que lo he hecho

    <Image Width="90" Height="90" 
           Source="{Binding Path=ImageSource}"
           Margin="0,0,0,5" />

    Y la propiedad de la clase es simplemente esto

    public object ImageSource {
        get {
            BitmapImage image = new BitmapImage();
    
            try {
                image.BeginInit();
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
                image.UriSource = new Uri( FullPath, UriKind.Absolute );
                image.EndInit();
            }
            catch{
                return DependencyProperty.UnsetValue;
            }
    
            return image;
        }
    }

    Supongo que puede ser un poco más trabajo que el convertidor de valores, pero es otra opción.

    • Una implementación similar a esto es perfecto para cuando el recurso de mapa de bits ya está cargado en el objeto, y desea pasar los bits a la unión. GRACIAS!
  4. 8

    Que usted necesita para tener una implementación de IValueConverter interfaz que convierte el uri en una imagen. Su Convertir implementación de IValueConverter se verá algo como esto:

    BitmapImage image = new BitmapImage();
    image.BeginInit();
    image.UriSource = new Uri(value as string);
    image.EndInit();
    
    return image;

    Entonces usted tendrá que utilizar el convertidor en su unión:

    <Image>
        <Image.Source>
            <BitmapImage UriSource="{Binding Path=ImagePath, Converter=...}" />
        </Image.Source>
    </Image>
  5. 7

    El problema con la respuesta de que fue elegido aquí es que al desplazarse adelante y atrás, el convertidor va a activar cada vez que la página se muestra.

    Esto hace que los nuevos identificadores de archivo para ser creado de forma continua y bloqueará cualquier intento de eliminar el archivo, ya que todavía está en uso. Esto puede ser verificado mediante el uso de Process Explorer.

    Si el archivo de imagen puede ser eliminado en algún momento, un convertidor de como se puede utilizar:
    el uso de XAML que se unen a un Sistema.De dibujo.Imagen dentro de un Sistema.Windows.Control de imagen

    La desventaja de esta secuencia de memoria método es que la imagen(s) se cargan y se decodifica cada vez y sin almacenamiento en caché puede tener lugar:
    «Para evitar que las imágenes se decodifica más de una vez, asignar la Imagen.Origen de la propiedad de una Uri en lugar de utilizar las secuencias de memoria»
    Fuente: «consejos de Rendimiento para aplicaciones de la Tienda Windows mediante XAML»

    Para resolver el problema de rendimiento, el modelo de repositorio puede ser utilizado para proporcionar una capa de caché. El almacenamiento en caché podría tener lugar en la memoria, que puede causar problemas de memoria, o en miniatura de los archivos que residen en una carpeta temporal que puede ser desactivada cuando la aplicación se cierra.

  6. 4

    puede utilizar

    ImageSourceConverter clase

    para conseguir lo que quieres

        img1.Source = (ImageSource)new ImageSourceConverter().ConvertFromString("/Assets/check.png");

Dejar respuesta

Please enter your comment!
Please enter your name here