none
如何绑定独立存储中的图片 RRS feed

  • 问题

  •  为grid绑定了一张图片

    <Grid.Background>
          <ImageBrush ImageSource="{Binding ImageFilePath}" Stretch="UniformToFill" ></ImageBrush>
     </Grid.Background>

    ImageFilePath是独立存储的地址,但是为什么运行程序后看不到图片呢?

    (第一次运行程序时候会将图片写入独立存储)但问题是单目调试ImageFilePath,地址是正确的,写入也成功了

    同样被写入独立存储的音乐可以正常播放,为什么图片不行呢?


    2014年7月18日 9:30

答案

  • Img 是图片的Path,相当于你代码中的ImageFilePath,strToImgSource是Converter的Key。

    你可以这么写:

    <phone:PhoneApplicationPage
        ...
        xmlns:converter="clr-namespace:PhoneApp4"
        >
        <phone:PhoneApplicationPage.Resources>
            <converter:StringToImageSource x:Key="strToImgSource"/>
        </phone:PhoneApplicationPage.Resources>
        <Grid x:Name="LayoutRoot">
            <Grid.Background>      
                <ImageBrush x:Name="LayoutBackground" ImageSource="{Binding Converter={StaticResource strToImgSource}" Stretch="UniformToFill" /> 
           </Grid.Background>
        </Grid>
    </phone:PhoneApplicationPage>

    其中页面的头部分我省略了,你保持原有代码,并加上xmlns:converter="clr-namespace:PhoneApp4"这句即可。注意这里的PhoneApp4要替换成你的StringToImageSource所在的namespace。

    另外ImageBrush的绑定部分,我没有绑定任何字段,而是直接使用了Binding,这样你的后台代码只需要这样写就可以了:

    // ImageFilePath 就是你的图片路径
    LayoutBackground.DataContext = ImageFilePath;

    • 已标记为答案 孟云帆 2014年7月19日 1:05
    2014年7月18日 12:28
  • ?????

    • 已标记为答案 孟云帆 2014年7月19日 1:05
    • 已编辑 Shi Xin 2015年7月27日 5:39
    2014年7月18日 12:31

全部回复

  • 你好。

    独立存储中的图片是不可以直接绑定到路径的,你需要将路径和BitmapImage之间做一个Converter。

    XAML中这样写:

    <ImageBrush 
        ImageSource="{Binding Img, 
                       Converter={StaticResource strToImgSource}"
                       Stretch="UniformToFill" />  

    Converter:

    public class StringToImageSource : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            try
            {
                BitmapImage ret = new BitmapImage();
                string filePath = (string)value;
    
                using (IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    if (iso.FileExists(filePath))
                    { 
                        using (var source = iso.OpenFile(filePath, FileMode.Open, FileAccess.Read))
                        {
                            ret.SetSource(source);
                        }
                    }
                    else
                    { 
                        ret = null;
                    }
    
                    return ret;
                }
            }
            catch (Exception)
            {
                return null;
            }
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return DependencyProperty.UnsetValue;
        }
    
    }


    • 已编辑 shao.meng 2014年7月18日 9:43
    • 已标记为答案 孟云帆 2014年7月18日 11:34
    • 取消答案标记 孟云帆 2014年7月18日 11:34
    • 已建议为答案 Shi Xin 2014年7月18日 12:32
    2014年7月18日 9:42
  • 亲,这个转化的类是看懂了,但是怎么用呢?

    ImageSource="{Binding Img, 
                       Converter={StaticResource strToImgSource}"

    希望可以重点解释一下这行XAML

    Img和strToImgSource是什么意思,我直接复制到工程中,果断有问题

    谢谢了

    2014年7月18日 11:37
  • Img 是图片的Path,相当于你代码中的ImageFilePath,strToImgSource是Converter的Key。

    你可以这么写:

    <phone:PhoneApplicationPage
        ...
        xmlns:converter="clr-namespace:PhoneApp4"
        >
        <phone:PhoneApplicationPage.Resources>
            <converter:StringToImageSource x:Key="strToImgSource"/>
        </phone:PhoneApplicationPage.Resources>
        <Grid x:Name="LayoutRoot">
            <Grid.Background>      
                <ImageBrush x:Name="LayoutBackground" ImageSource="{Binding Converter={StaticResource strToImgSource}" Stretch="UniformToFill" /> 
           </Grid.Background>
        </Grid>
    </phone:PhoneApplicationPage>

    其中页面的头部分我省略了,你保持原有代码,并加上xmlns:converter="clr-namespace:PhoneApp4"这句即可。注意这里的PhoneApp4要替换成你的StringToImageSource所在的namespace。

    另外ImageBrush的绑定部分,我没有绑定任何字段,而是直接使用了Binding,这样你的后台代码只需要这样写就可以了:

    // ImageFilePath 就是你的图片路径
    LayoutBackground.DataContext = ImageFilePath;

    • 已标记为答案 孟云帆 2014年7月19日 1:05
    2014年7月18日 12:28
  • ?????

    • 已标记为答案 孟云帆 2014年7月19日 1:05
    • 已编辑 Shi Xin 2015年7月27日 5:39
    2014年7月18日 12:31