1

クラスCurrencyImgプロパティを使用して実行時に静的リソースを検索する次のXAMLがあります。ツリービューにはこれらが多数あるため、同じ画像を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 に答える