2011-11-08 3 views
0

Как можно изменить источники изображений в XAML во время выполнения? Прямо сейчас я их указываю на встроенный URI ресурса. В модели представления у меня есть элементы управления изображением, определенные, но не привязанные ни к чему, как я могу получить их в представлении?Динамически изменяющиеся источники изображения XAML?

+0

http://stackoverflow.com/questions/2531539/wpf-databind-image-source-in-mvvm – kenny

+0

Их решение использует DataTriggers, который требует определения всех URIs в XAML, есть ли способ, с помощью которого я мог бы связать элементы управления изображением из моего ViewModel с представлением, чтобы представление не касалось источника изображения? Благодарю. – TheWolf

ответ

0

Например, можно использовать imageconverter. Если вы установите свойство для привязки, вы можете получить значение из конвертера, а затем вернуть BitmapSource для привязки.

public sealed class ImageConverter : IValueConverter 
{ 
    internal static class NativeMethods 
    { 
     [DllImport("gdi32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     internal static extern bool DeleteObject(IntPtr hObject); 
    } 

    public BitmapSource ToBitmapSource(System.Drawing.Bitmap source) 
    { 
     BitmapSource bitSrc = null; 

     var hBitmap = source.GetHbitmap(); 

     try 
     { 
      bitSrc = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
       hBitmap, 
       IntPtr.Zero, 
       Int32Rect.Empty, 
       BitmapSizeOptions.FromEmptyOptions()); 
     } 
     catch (Win32Exception) 
     { 
      bitSrc = null; 
     } 
     finally 
     { 
      NativeMethods.DeleteObject(hBitmap); 
     } 

     return bitSrc; 
    } 

    public object Convert(object value, Type targetType, 
          object parameter, CultureInfo culture) 
    { 
     // call function to get BitmapSource 
     using (Bitmap bitmap = new Bitmap("{image path}")) 
     { 

      return ToBitmapSource(bitmap); 
     } 
    } 

}

1
 <Image x:Name="UserImage" Source="{Binding MembershipUserViewModel.UserId, Converter={StaticResource _userIdToImageConverter}, UpdateSourceTrigger=Explicit}" Stretch="Fill" /> 


public class UserIdToImageConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var image = String.Format("{0}/../{1}.jpg", 
        Application.Current.Host.Source, 
        value); 

     var bitmapImage = new BitmapImage(new Uri(image)){CreateOptions = BitmapCreateOptions.IgnoreImageCache}; 
     return bitmapImage; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
Смежные вопросы