wpf - 如果 ImageSource 引用了无法访问的 URL,如何防止 WPF 图像被阻塞?

标签 wpf image dns

我正在编写一个 WPF 应用程序,并尝试使用以下 XAML 将图像绑定(bind)到我的 View 模型:

<Image Source="{Binding Author.IconUrl, IsAsync=True}" />

问题在于图像 URL 是由用户定义的,并且通常可以引用托管在 Intranet Web 服务器上的图像。当 WPF 应用程序远程运行时,它会在尝试解析现在无法访问的图像时锁定。

我以为“IsAsync”绑定(bind)属性会导致加载在后台发生,但看起来 DNS 解析仍然可能发生在主线程中?

即使图像无法访问,我该怎么做才能防止我的应用程序锁定?

谢谢, 科里

最佳答案

这是给您的一个新答案,希望比我之前的答案更好。

当您使用“IsAsync”true 创建绑定(bind)时,它会在单独的线程上执行对 Author.IconUrl 的属性访问,但会在主线程中执行从 Uri 到 ImageSource 的转换。正如您所发现的,转换在主线程上进行 DNS 查找,导致应用程序锁定。

由于您的源是http/https,WPF将自动处理异步加载图像源。所以我怀疑您所需要做的就是使 DNS 查找异步。

这可以通过使用附加属性来自动化:

<Image my:ImageAsyncHelper.SourceUri="{Binding Author.IconUrl}" />

其中 ImageAsyncHelper 定义为:

public class ImageAsyncHelper : DependencyObject
{
  public static Uri GetSourceUri(DependencyObject obj) { return (Uri)obj.GetValue(SourceUriProperty); }
  public static void SetSourceUri(DependencyObject obj, Uri value) { obj.SetValue(SourceUriProperty, value); }
  public static readonly DependencyProperty SourceUriProperty = DependencyProperty.RegisterAttached("SourceUri", typeof(Uri), typeof(ImageAsyncHelper), new PropertyMetadata
  {
    PropertyChangedCallback = (obj, e) =>
    {
      ((Image)obj).SetBinding(Image.SourceProperty,
        new Binding("VerifiedUri")
        {
          Source = new ImageAsyncHelper { GivenUri = (Uri)e.NewValue },
          IsAsync = true,
        });
    }
  });

  Uri GivenUri;
  public Uri VerifiedUri
  {
    get
    {
      try
      {
        Dns.GetHostEntry(GivenUri.DnsSafeHost);
        return GivenUri;
      }
      catch(Exception)
      {
        return null;
      }

    } 
  } 
}

其工作原理是:

  1. 当您设置附加属性时,它会创建 ImageAsyncHelper 的实例,并将 Image.Source 异步绑定(bind)到异步帮助器对象的 ImageSource 属性。
  2. 当异步绑定(bind)触发时,它会调用 VerifiedUri getter,该 getter 验证地址是否可访问,然后返回 GiveUri
  3. 如果您的 IconUri 属性发生更改,绑定(bind)会导致附加属性更新,从而创建并绑定(bind)新的 ImageAsyncHelper,以便图像保持最新状态。

关于wpf - 如果 ImageSource 引用了无法访问的 URL,如何防止 WPF 图像被阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2463852/

相关文章:

c# - 以样式定义 InputBindings

c# - 名称 "Settings"在命名空间 "clr-namespace:MyApp.Properties"中不存在

wpf - View 更改时调整窗口大小

c# - 从父 View 模型派生的空 ViewModel 是否存在问题? WPF

Node.js DNS 反向

android - 如何在 android 布局中缩小图像的大小?

java - 如何访问 Eclipse 项目文件夹中的图像文件

javascript - 使用 XHR 请求加载图像

dns - 如何下载所有域 WHOIS 数据?

c++ - LabVIEW 和 C++ DLL