gpt4 book ai didi

windows-phone-7 - 将存储在独立存储中的图像绑定(bind)到 Windows Phone 中的图像控件

转载 作者:行者123 更新时间:2023-12-04 07:04:57 25 4
gpt4 key购买 nike

是否可以通过 xaml 将 Isolates 存储中存在的图像绑定(bind)到图像控件。我发现了一些实现,比如通过属性获取图像并将其绑定(bind)到 xaml 控件中。但这不是我正在寻找的实现。我的问题是,编写一个附加属性和辅助方法来从独立存储中获取内容。我在 Windows phone 7 中使用的 LowProfileImage 类中找到了类似的实现。但我认为它现在已被弃用。如果有人尝试过类似的实现,请帮助我实现相同的目标。此外,如果实现有任何性能消耗,请也提及该信息。

最佳答案

是的,可以在应用程序 UI 中使用来自隔离存储的图像。它需要将图像从文件加载到 BitmapImage然后绑定(bind)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 元素绑定(bind)到的某些 View 模型属性的方法。当然,您的 View 模型应该正确实现 INotifyPropertyChanged这种方法可靠地工作的接口(interface)。

如果你想使用附加属性的方法,你可以这样做:
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 上的隔离存储中进行异步读取的唯一方法。而且您绝对不想同步执行此操作。

  • 但它有一个重要的优势:
  • 有用! :)
  • 关于windows-phone-7 - 将存储在独立存储中的图像绑定(bind)到 Windows Phone 中的图像控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16102651/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com