首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

Image source 赋值有关问题

2012-08-08 
Image source 赋值问题1、this.abc.Source new BitmapImage(new Uri(/1.jpg, UriKind.RelativeOrAbsolu

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方法中返回一个空字符串,或者添加一个默认的图片,如果有异常就显示这个默认的图片。

热点排行