强制WPF BitmapImage从其UriSource重新加载

时间:2017-02-14 00:38:48

标签: wpf

我正在尝试构建一个基于<?xml version="1.0" encoding="UTF-8" ?> <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" /> <xsl:template match="MAIN/*/*"> <xsl:copy> <xsl:call-template name="proc_node"/> </xsl:copy> </xsl:template> <xsl:template name="proc_node"> <xsl:variable name="thisName" select="name()"/> <xsl:variable name="cnt" select="string-length(.)"/> <xsl:if test="$cnt &gt; 0"> <xsl:value-of select="."/> </xsl:if> <xsl:if test="$cnt = 0"> <xsl:variable name="prevBucket" select="../preceding-sibling::*[1]"/> <xsl:variable name="prevElem" select="$prevBucket/*[name()=$thisName]"/> <xsl:variable name="cnt" select="string-length($prevElem)"/> <xsl:if test="$cnt &gt; 0"> <xsl:value-of select="$prevElem"/> </xsl:if> <xsl:if test="$cnt = 0">ABCD</xsl:if> </xsl:if> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> </xsl:template> </xsl:transform> 的自定义控件,它只是使图像在计时器上重新加载(来自相同的URI)。原始图像显示正常,但似乎没有刷新。

这是自定义控件:

Image

我正在使用它:

public class RefreshImage : Image
{
    protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);
        this.Loaded += RefreshImage_Loaded;
    }

    private void RefreshImage_Loaded(object sender, RoutedEventArgs e)
    {
        var timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += RefreshImage_Tick;
        timer.Start();
    }

    private void RefreshImage_Tick(object sender, System.EventArgs e)
    {
        var bm = (BitmapImage) Source;
        bm.InvalidateProperty(BitmapImage.UriSourceProperty);
    }
 }

InvalidateProperty的文档似乎表明它正是我需要的:

  

您还可以使用InvalidateProperty强制重新评估a   绑定无法实现的数据源   建议使用INotifyPropertyChanged通知机制。

<custom:RefreshImage> <Image.Source> <BitmapImage UriCachePolicy="NoCacheNoStore" CreateOptions="IgnoreImageCache" CacheOption="None" UriSource="{Binding Uri}"/> </Image.Source> </custom:RefreshImage> 上举起INotifiyPropertyChanged.PropertyChanged事件也不会触发图像重新加载。

1 个答案:

答案 0 :(得分:0)

似乎BitmapSource通常是不可变对象。完成初始化后,将忽略任何进一步的属性更改。我怀疑这包括UriSource

以下阶段经常在此MSDN post on creating custom ImageSources中重复:

  

ISupportInitialize接口用于捕捉的值   初始化完成时的属性。进一步改变了   属性被忽略。