Image source 赋值问题
1、this.abc.Source = new BitmapImage(new Uri("/1.jpg", UriKind.RelativeOrAbsolute));
//这种的话 1.jpg 放在ClintBin 下了。不行
2、this.abc.Source = new BitmapImage(new Uri("1.jpg", UriKind.RelativeOrAbsolute));
或者
this.abc.Source = new BitmapImage(new Uri("../1.jpg", UriKind.RelativeOrAbsolute));
//这种的话 1.jpg 直接放在跟目录 下。不行
3、Uri uri = new Uri("1.jpg", UriKind.Relative);
ImageSource imgSource = new System.Windows.Media.Imaging.BitmapImage(uri);
this.abc.SetValue(Image.SourceProperty, imgSource);
//这种的话 1.jpg 直接放在跟目录 下。不行
4、 this.abc.Source = new BitmapImage(new Uri("F:\\1.jpg", UriKind.RelativeOrAbsolute));
////这种的话 1.jpg 直接放在F跟目录 下。不行
上述赋值后,原来的Image图片就没有了,但就是得不到赋值的图片,求解
[解决办法]
你想实现什么?
图片无非就两种,一种是嵌入的资源文件;另一种是相对XAP包的路径(和ASPX的URL一样的)
[解决办法]
在BIN目录的同级创建一个Images目录。把1.jpg图片放里面。
this.abc.Source = new BitmapImage(new Uri("/项目名;component/Images/1.jpg", UriKind.RelativeOrAbsolute));
就可以得到图片了。
[解决办法]
值转换独立于数据的存储方式和数据的展示方式。例如:你有一个图片以二进制的形式存储在数据库中,你可以把它转换成System.Windows.Media.Imaging.BitmapImage对象。当然了,这么设计也许不是最合适的。
你可能需要很灵活的创建更多的类型,你的数据类库可能被Silverlight和Windows Form(需要转换成System.Drawing.Bitmap)都有调用。在这种情况下,你需要将原始的二进制转换成BitmapImage类型。
从二进制转换为一张图片,你首先要创建一个BitmapImage对象,同时将二进制读到MemoryStram中。然后,调用BitmapImage.SetSource()方法,将流中的数据传输给BitmapImage对象。
产品表中的可能没有存储二进制的图片信息,可能存储的是和产品有关的图片的路径。这种情况下,你就更有理由延缓创建图片对象。第一,图片可能没有访问权限,依赖于应用运行在哪里;第二,没有必要分配额外的内存资源,除非你要显示它。
ProductImage字段存储的是图片的文件名,不是图片的完整路径。这样给你一个灵活的配置,你可以从任何地方获取图片。值转换环类有任务将存储的文件名结合网站,返回图片的地址。网站的根URI使用一个自定义属性RootUri存储,默认是网站的Uri,下面是完整代码。
代码
代码
public partial class ImagePathConverter:IValueConverter
{
private string _rootUri;
public string RootUri
{
get { return this._rootUri; }
set { this._rootUri = value; }
}
public ImagePathConverter()
{
string uri = "http://baidu.com/";
_rootUri = uri.Remove(uri.LastIndexOf("/"),
uri.Length - uri.LastIndexOf('/'));
}
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string imagePath = RootUri + "/" + (string)value;
return new System.Windows.Media.Imaging.BitmapImage(new Uri(imagePath));
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//图片是不能编辑的,这里就没有必要支持反向转换
throw new NotImplementedException();
}
#endregion
}
代码
<UserControl x:Class="Silverlight.ValueConverter.ImagePathConvertERPage"
XMLns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namASPace:Silverlight.ValueConverter"
Width="400" Height="300">
<UserControl.Resources >
<local:ImagePathConverter x:Key="ImagePathConverter"></local:ImagePathConverter>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions >
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions >
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Image Margin="5" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left"
Source="{Binding ProductImagePath, Mode=TwoWay, Converter={StaticResource ImagePathConverter}}"></Image>
</Grid>
</UserControl>
你可以改进这里例子,首先,在创建一个不存在图片的BitmapImage的时候你可以抛异常,在你绑定数据的时候可以收到。或者你可以在 ImagePathConverter类中加一个属性,来配置这个行为。添加一个bool类型的属性SuppressExceptions。如果设置为 true,你可以捕获一个异常,然后再Convert方法中返回一个空字符串,或者添加一个默认的图片,如果有异常就显示这个默认的图片。