1

我有以下 XAML,它使用类 CurrencyImg 属性在运行时查找静态资源,因为树视图中有很多这样的资源,我不想加载相同的图像 1000 次,我保留它一个资源字典,所以它只加载一次。

<Image Name="imgCurrency"  Grid.Column="5" Margin="0,0,0,0"  Source="{w:ImageStaticResource {Binding CurrencyImg}}" Height="22" VerticalAlignment="Top"/>

使用示例资源字典条目作为

<ImageSource x:Key="..\Resources\Images\USD.ico">../Resources/Images/USD.ico</ImageSource>

楼盘如下

public string CurrencyImg
{
    get
    {
        if (DisplayUSDRate)
        {
            return AppString.General.ImagePath + AppString.CurrencyId.USD + ".ico";
        }
        else
        {
            return AppString.General.ImagePath + curr + ".ico";
        }
    }
}

以及完成工作的财产行动

public override bool DisplayUSDRate
{
    get { return _customer.DisplayUSDRate; }
    set
    {
        _customer.DisplayUSDRate = value;
        OnPropertyChanged("CurrencyImg");
    }
}

现在,当它运行时, OnPropertyChanged("CurrencyImg") 什么都不做,原因很清楚。在 XAML 中,我没有直接绑定到 CurrencyImg 属性,而是将其用作我的 StaticResourceExtension 类的参数,因此当我调用 OnPropertyChanged 时,它认为没有要更新的绑定属性,因此 XAML 图像不会更新. 我可以理解这一点,但显然这对我没有帮助,因为我需要发生的事情如下。

1) 让类确定为该行显示哪个货币图像 2) 让图像来自资源字典,这样它们就不会被多次加载或性能受到严重影响 3) 对 DisplayUSDRate 属性的更改为通过将标志更新为适当的图像来反映。这是我无法弄清楚如何处理我的 StaticResourceExtension 的一点(代码如下)

using System;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

namespace Citi.Rbcs.UI.Windows
{
    public class ImageStaticResource : StaticResourceExtension
    {
        public Binding Binding { get; set; }
        private static readonly DependencyProperty DummyProperty;

        public ImageStaticResource()
        {
        }

        public ImageStaticResource(Binding binding)
        {
            Binding = binding;
        }

        static ImageStaticResource()
        {
            DummyProperty = DependencyProperty.RegisterAttached(
                "Dummy", 
                typeof (Object), 
                typeof (DependencyObject),
                new UIPropertyMetadata(null));
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); 
            var targetObject = (FrameworkElement)target.TargetObject; 

            Binding.Source = targetObject.DataContext; 
            var DummyDO = new DependencyObject(); 
            BindingOperations.SetBinding(DummyDO, DummyProperty, Binding); 

            ResourceKey = DummyDO.GetValue(DummyProperty);

            var resourceDictionary = new ResourceDictionary
                                         {
                                             Source = new Uri("pack://application:,,,/Windows/Images.xaml")
                                         };

            var key = (string) ResourceKey;            
            if (!resourceDictionary.Contains(key)) ResourceKey = "Default";

            return base.ProvideValue(serviceProvider);
        }
    }
}
4

1 回答 1

1

您可以编写一个非常简单的绑定转换器,将图像 URI 字符串转换为缓存的 ImageSource 对象:

public class StringToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var imageUrl = value as string;
        var image = MemoryCache.Default.Get(imageUrl) as ImageSource;

        if (image == null)
        {
            image = new BitmapImage(new Uri(imageUrl));
            MemoryCache.Default.Set(imageUrl, image, new CacheItemPolicy());
        }

        return image;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2012-11-05T15:54:06.840 回答