gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:24:20 25 4
gpt4 key购买 nike

我正在编写一个 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/

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