2011-11-08 85 views
0

运行期间XAML中的图像源如何更改?现在我让他们指向一个嵌入式资源URI。在视图模型中,我定义了图像控件但没有绑定任何东西,我如何在视图中获取这些控件?动态更改XAML图像源?

+0

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

+0

他们的解决方案使用其要求限定的所有URI DataTriggers在XAML中,有没有一种方法可以将我的ViewModel中的Image控件绑定到视图,以便View不关心图像的来源?谢谢。 – 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(); 
    } 
}