我正在尝试使用 IMultiValueConverter 在另一个线程中提取图标,即使这在另一个项目中有效,但它在这里不起作用。IsAsync=True 会在没有 FullPath 值的情况下启动转换器,并且 IsAsync=False 会阻止 UI,尤其是在从 .lnk 文件中提取图标时。
<Image>
<Image.Source>
<MultiBinding Converter="{StaticResource Fullpath2Icon}" >
<MultiBinding.Bindings>
<Binding RelativeSource="{RelativeSource Self}" />
<Binding Path="FullPath" IsAsync="True" />
</MultiBinding.Bindings>
</MultiBinding>
</Image.Source>
</Image>
public class Fullpath2IconConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
System.Windows.Controls.Image image = values[0] as System.Windows.Controls.Image;
if (values[1] == null) return null;
string mypath = values[1] as string;
ThreadPool.QueueUserWorkItem((WaitCallback)delegate
{
image.Dispatcher.Invoke(DispatcherPriority.Normal,
(ThreadStart)delegate {
image.Source = System.Drawing.Icon.ExtractAssociatedIcon(mypath).IconToImageSource();
您能解释一下原因或提出任何改进方法吗?
编辑: 我创建了一个类扩展图像,现在它看起来像这样:
<local:cIconImage Path="{Binding FullPath}"></local:cIconImage>
public class cIconImage : System.Windows.Controls.Image
{
public cIconImage()
{
//this.Loaded += new RoutedEventHandler(cIconImage_Loaded);
Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(() =>
{
Source = GetImage();
}));
}
现在填充列表要好得多,并且每个图标都在提取时出现,但是在较长的 .lnk 提取过程中 UI 仍然被锁定。