【问题标题】:Replace dynamically BitmapImage in Button (xaml)在 Button (xaml) 中动态替换 BitmapImage
【发布时间】:2017-01-11 11:20:57
【问题描述】:

我在 xaml 中有以下代码 sn-p:

<UserControl x:Class="Ournamespace.OurClassName"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    ...
             d:DesignHeight="250" d:DesignWidth="774" Loaded="UserControl_Loaded">

....
<Button Grid.Column="0" x:Name="Button_NewMarker" Style="{StaticResource ViewpointFlatButtonStyle}" Width="90" Height="65" 
    VerticalAlignment="Top" Click="Button_NewMarker_Click" x:FieldModifier="public" Margin="0,0,0,0" Grid.Row="1">
    <BitmapImage UriSource="Icons/markers_add_disabled.png" />
</Button>

我尝试通过加载新图像来动态替换按钮上的图像

if( !imgCache.ContainsKey(path) )
{
    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.UriSource = new Uri(path, UriKind.Relative);
    bi.DownloadFailed += bi_DownloadFailed;
    bi.DecodeFailed += bi_DecodeFailed;
    bi.EndInit();
    imgCache[path] = bi;

}
Button_NewMarker.BeginInit();
Button_NewMarker.Content = imgCache[path];
//Button_NewMarker.Content = oldbmp;
Button_NewMarker.EndInit();

没有发生错误(为此被覆盖的事件) 和 BitmapImage 似乎被替换了 - 但由于某种原因它是灰色的。 图像作为资源添加到项目中,加载的第一个图像似乎正在工作 - 但不是动态替换的。

我也尝试过使用&lt;Image ... &gt; 甚至&lt;Image ... &lt;ImageBitmap - 但它们都不起作用 - 我怀疑这与我们的控件是 UserControl 有关。

我在互联网上看到的 - 有大量关于应该做什么和如何做的建议 - 我现在希望用绝对最少的代码量来完成 - 最好不使用绑定和模板。绑定可以作为手动完成后的第二步。

【问题讨论】:

  • 也许你可以尝试从 ViewModel 绑定它?
  • 您可以将整个答案发布为答案吗?我宁愿先进行更改而没有约束力,只是为了理解这个概念。如果需要,接下来可以将绑定作为复制数据的高级机制。

标签: c# wpf xaml


【解决方案1】:

如果图像文件作为资源文件进行管理(即项目文件的Build Action 设置为Resource),您应该通过Resource File Pack URI 加载它们。

假设一个项目文件夹Images带有一个图像文件Test.png

var bi = new BitmapImage(new Uri("pack://application:,,,/Images/Test.png"));

使用文件名作为键,abobe 可能看起来像:

var path = "Test.png";
var uri = "pack://application:,,,/Images/" + path;

imgCache[path] = new BitmapImage(new Uri(uri));

【讨论】:

  • 据我所知,我正在使用已经相似的技术 - new Uri(path, UriKind.Relative); - 仅在您使用绝对网址的情况下。两种方法都可以正常工作,如果结果相同,为什么要用另一种方法替换一种方法?
  • new Uri(path, UriKind.Relative) 是不同的,即本地文件的相对 URI。 Pack URI 访问编译到程序集中的资源文件。关于“两种方法都很好”,那么您的问题是什么?
  • 从调试器中我可以看到以下内容:imgCache[path] 显示为"*{Icons/markers_add_disabled.png}",但在监视窗口中执行此行Button_NewMarker.Content = imgCache[path]; 后变为:{pack://application:,,,/VdcUi;component/Icons/markers_add_disabled.png} 所以我不确定路径如何已解决,但我怀疑它已正确解决。也不调用 bi_DownloadFailed&bi_DecodeFailed。
  • 这是否意味着按钮将新图像显示为内容?
  • 也许 - 但按钮看起来仍然是灰色的。在这个分配场景中还有什么问题?我也尝试分配宽度/高度,但它不会影响整体行为。
猜你喜欢
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2017-07-26
  • 1970-01-01
相关资源
最近更新 更多