存储在独立存储图像控制在Windows手机绑定图片(Binding Image stored in

2019-08-31 13:11发布

是否有可能存在于所述分离物存储到通过XAML图像控制图像结合。 我发现了一些实现比如通过属性获取图像,并绑定到XAML控制。 但是,这不是我所寻找的实施。 我的问题是这样,写一个附加属性和辅助的方法来从独立存储的内容。 我发现在LowProfileImage类有着相似的应用,在Windows 7的手机使用,但我认为它现在已经过时了。 如果没有人尝试过类似的实现,请帮我实现相同。 此外,如果执行有任何性能水渠请注明这些信息了。

Answer 1:

是的,这是可以使用从独立存储图像的应用程序UI。 它需要从文件到加载图像BitmapImage ,然后结合ImageSource你的控制到的BitmapImage 。 我用下面的方法:

首先,有异步加载图像的方法:

private Task<Stream> LoadImageAsync(string filename)
    {
        return Task.Factory.StartNew<Stream>(() =>
        {
            if (filename == null)
            {
                throw new ArgumentException("one of parameters is null");
            }

            Stream stream = null;

            using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (isoStore.FileExists(filename))
                {
                    stream = isoStore.OpenFile(filename, System.IO.FileMode.Open, FileAccess.Read);                               
                }
            }
            return stream;
        });
    }

然后,它可以像这样使用:

public async Task<BitmapSource> FetchImage()
    {
        BitmapImage image = null;
        using (var imageStream = await LoadImageAsync(doc.ImagePath))
        {
            if (imageStream != null)
            {
                image = new BitmapImage();
                image.SetSource(imageStream);
            }
        }
        return image;
    }

最后,你刚才的返回值赋给FetchImage()方法来一些您的视图模型的财产,对此UI元素绑定。 当然,您的视图模型应该正确实现INotifyPropertyChanged接口,这种方法能可靠地工作。


如果要使用附加属性的方法,这里是你如何做到这一点:

public class IsoStoreImageSource : DependencyObject
{
    public static void SetIsoStoreFileName(UIElement element, string value)
    {
        element.SetValue(IsoStoreFileNameProperty, value);
    }
    public static string GetIsoStoreFileName(UIElement element)
    {
        return (string)element.GetValue(IsoStoreFileNameProperty);
    }

    // Using a DependencyProperty as the backing store for IsoStoreFileName.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsoStoreFileNameProperty =
        DependencyProperty.RegisterAttached("IsoStoreFileName", typeof(string), typeof(IsoStoreImageSource), new PropertyMetadata("", Changed));

    private static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Image img = d as Image;

        if (img != null)
        {
            var path = e.NewValue as string;
            SynchronizationContext uiThread = SynchronizationContext.Current;

            Task.Factory.StartNew(() =>
            {
                using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    if (isoStore.FileExists(path))
                    {
                        var stream = isoStore.OpenFile(path, System.IO.FileMode.Open, FileAccess.Read);
                        uiThread.Post(_ =>
                        {
                            var _img = new BitmapImage();
                            _img.SetSource(stream);
                            img.Source = _img;
                        }, null);
                    }
                }
            });               
        }
    }
}

然后在XAML:

<Image local:IsoStoreImageSource.IsoStoreFileName="{Binding Path}" />

这种方法的一些限制:

  • 它仅适用于Image控制,但你可以改变这你要哪个类型。 这只是不是很通用。
  • 性能方面,它会使用一个线程从线程池每次图像信号源变更。 这是从在Windows Phone 8的独立存储做异步读,现在唯一的办法。 你肯定不希望同步执行此操作。

但它有一个重要优势之一:

  • 有用! :)


Answer 2:

我喜欢上面的方法,但没有做,如果你有兴趣的更简单更哈克的方式。

你可以进入你的XAML和绑定图像源的字符串属性,然后把文件路径进入房地产动态。

<!-- XAML CODE -->
 <Image Source="{Binding imagePath}"/>


//Behind property
public String imagePath { get; set; }

加载路径到图像路径然后绑定图像源到图像路径串。 您可能需要做一个INotifyPropertyChanged的,但是这种方法应该适当的结合工作。



文章来源: Binding Image stored in the Isolated Storage to Image Control in Windows Phone