Tôi muốn hiển thị một người dùng Gravatar trong ứng dụng WPF của tôi. Đây là cách tôi ràng buộc Điều khiển Hình ảnh:Imagecontrol của WPF đóng băng giao diện người dùng
<Image Source="{Binding Path=Email, Converter={StaticResource GravatarConverter},IsAsync=True}">
Trường hợp GravatarConverter trả về URL cho Email đã cho. Rất tiếc, điều này đang chặn hoàn toàn giao diện người dùng của tôi khi tải Hình ảnh đầu tiên. Xin lưu ý rằng tôi đang sử dụng "IsAsync = True". Sau khi một số nghiên cứu tôi phát hiện ra rằng tôi có thể hack xung quanh vấn đề này khi gọi FindServicePoint trong một thread riêng biệt trên các ứng dụng khởi động:
Task.Factory.StartNew(() => ServicePointManager.FindServicePoint("http://www.gravatar.com", WebRequest.DefaultWebProxy));
Nhưng đây không phải là làm việc khi FindServicePoint là không hoàn thành trong khi ứng dụng của tôi đã được tải một hình ảnh. Có thể ai đó vui lòng giải thích lý do tại sao một WPF-App cần FindServicePoint này ở tất cả, tại sao điều này là ngăn chặn giao diện người dùng và làm thế nào để tránh chặn?
Cảm ơn
Cập nhật: Khi nó quay ra vấn đề của tôi đã biến mất sau khi tôi bỏ chọn "Automatic detect settings" trong Internet Explorers "Internet Options" -> "Connections" -> "LAN Settings".
Tôi đã sử dụng ứng dụng WPF rất đơn giản này để tái tạo sự cố chỉ bằng cách chèn url cho hình ảnh trong hộp văn bản và nhấp vào nút. Với "Cài đặt tự động phát hiện", ứng dụng sẽ đóng băng trong một vài giây khi lần đầu tiên một hình ảnh được tải. Với tùy chọn này đã tắt tải ngay lập tức.
MainWindow.xaml
<Window x:Class="WpfGravatarFreezeTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBox Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" x:Name="tbEmail" />
<Button Grid.Column="0" Grid.Row="0" Click="buttonLoad_OnClick" HorizontalAlignment="Right">Set Source</Button>
<Image x:Name="img" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" />
</Grid>
MainWindow.xaml.cs
using System;
using System.Windows;
using System.Windows.Media.Imaging;
namespace WpfGravatarFreezeTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void buttonLoad_OnClick(object sender, RoutedEventArgs e)
{
try { this.img.Source = new BitmapImage(new Uri(this.tbEmail.Text)); }
catch(Exception){}
}
}
}
Cảm ơn bạn rất nhiều.Thật không may điều này vẫn đóng băng giao diện người dùng của tôi. Có vẻ như nó không quan trọng nếu tôi thực hiện điều này một cách không đồng bộ - vấn đề có vẻ là cuộc gọi ServicePointManager.FindServicePoint này được thực hiện một lần cho mỗi ứng dụng lần đầu tiên một hình ảnh từ xa được tải xuống. – user1130329
Trong trường hợp của tôi tất cả các công trình mà không đóng băng. Bạn gọi ServicePointManager.FindServicePoint ở đâu? Bạn có thể cung cấp một số mã không? Ngoài ra phải trả attantion rằng tôi đặt IsAsync = True. – Deffiss
OK Tôi đã tìm thấy "lỗi" - nhưng điều này thực sự lạ: nó phải làm với các thiết lập internet trong Internet Explorer. Tôi đã "Tự động phát hiện cài đặt" trong "Cài đặt" -> "Kết nối" -> "Cài đặt Lan" được kích hoạt. Khi tôi tắt tất cả mọi thứ tải hoàn hảo, khi tôi kích hoạt nó nó bị đóng băng. Vì vậy, điều này có vẻ là một vấn đề hệ điều hành? – user1130329