2016-06-18 10 views
0

Ich habe XAML Parse-Ausnahme "BitmapImage UriSource muss gesetzt sein". Während der Analyse wird mein Konverter erstellt, aber die Convert() -Methode wird nicht aufgerufen. Was mache ich falsch?C# Wpf Custom Converter ist erstellt, aber nicht

XAML:

<ImageBrush > 
    <ImageBrush.ImageSource> 
      <BitmapImage UriSource="{Binding Path=Value.Image, Converter={StaticResource imageConverter}, ConverterParameter=Value.Image}" CacheOption="OnLoad"></BitmapImage> 
    </ImageBrush.ImageSource> 
</ImageBrush> 

C#:

public class ImageConverter : IValueConverter 
{ 
    public ImageConverter() 
    { 
    } 
    public object Convert(object value, Type targetType, 
         object parameter, CultureInfo culture) 
    { 
     try 
     { 
      return new BitmapImage(new Uri((string)value)); 
     } 
     catch 
     { 
      return new BitmapImage(); 
     } 
    } 

    public object ConvertBack(object value, Type targetType, 
           object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Sofern Sie nicht ausdrücklich die 'Quelle eingestellt 'oder' RelativeSource' -Eigenschaft der Bindung, müssen Sie die 'DataContext' -Eigenschaft des Steuerelements, das den ImageBrush (oder eines seiner übergeordneten Steuerelemente) enthält, auf eine Instanz der Klasse mit der' Value' -Eigenschaft setzen. Sie sollten eine verbindliche Fehlermeldung in dem Ausgabefenster in Visual Studio beachten. – Clemens

Antwort

0

Ich Art von Lösung gefunden habe. Da ich <BitmapImage> zur Einstellung CacheOption.OnLoad so meine lokale Quelldatei nicht gesperrt werden würde nur zu verwenden, benötigen, habe ich benutzerdefinierte ImageConverter erstellt:

[ValueConversion(typeof(Uri), typeof(BitmapImage))] 
public class ImageConverter : IValueConverter 
{ 
    public ImageConverter() 
    { 
    } 
    public object Convert(object value, Type targetType, 
         object parameter, CultureInfo culture) 
    { 
     try 
     { 
      if(value == null) 
      { 
       return null; 
      } 
      var image = new BitmapImage(); 
      image.BeginInit(); 
      image.UriSource = value is Uri ? (Uri)value : new Uri(value.ToString()); 
      image.CacheOption = BitmapCacheOption.OnLoad; 
      image.EndInit(); 
      return image;    
     } 
     catch 
     { 
      return null; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, 
           object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException("Convert back function is not supported"); 
    } 
} 

Und XAML:

<ImageBrush ImageSource="{Binding Path=Value.Image, Converter={StaticResource imageConverter}}"> 
</ImageBrush>