C# 动态替换按钮中的位图图像(xaml)

C# 动态替换按钮中的位图图像(xaml),c#,wpf,xaml,C#,Wpf,Xaml,我在xaml中有以下代码片段: <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://schem

我在xaml中有以下代码片段:

<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>
发生此事件的重写事件时没有错误 BitmapImage似乎被取代了,但由于某种原因,它是灰色的。 图像作为资源添加到项目中,加载的第一个图像似乎可以正常工作,但不能动态替换


我还尝试使用,甚至如果图像文件作为资源文件进行管理,即项目文件,其构建操作设置为资源,则应通过

假设项目文件夹包含图像文件Test.png:

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

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

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

也许你可以尝试从ViewModel绑定它?你能把整个答案作为答案发布吗?我更愿意在不受约束的情况下首先进行更改,只是为了理解概念。如果需要,下一步可以将绑定作为复制数据的高级机制来完成。请看这里,以我的最佳理解,我正在使用类似的技术-新的Uripath,UriKind.Relative;-只有在您的情况下,您才使用绝对url。这两种方法都很好,如果结果相同,为什么要用另一个方法替换一个呢?新的Uripath,UriKind.Relative是不同的东西,即本地文件的相对URI。包URI访问编译到程序集中的资源文件。关于这两种方法都可以很好地工作,那么您的问题是什么呢?从调试器中我可以看到以下内容:imgCache[path]显示为*{Icons/markers\u add\u disabled.png},但在执行此行按钮后_NewMarker.Content=imgCache[path];在“监视”窗口中,这将变成:{pack://application:,,,/VdcUi;component/Icons/markers\u add\u disabled.png}所以我不确定路径是如何解析的,但我怀疑它解析正确。此外,未调用bi_DownloadFailed和bi_DecodeFailed。这是否意味着按钮将新图像显示为内容?可能-但按钮看起来仍然是灰色的。在这个任务场景中,还有什么可能是错误的?我也尝试分配宽度/高度,但它不会影响整体行为。
var bi = new BitmapImage(new Uri("pack://application:,,,/Images/Test.png"));
var path = "Test.png";
var uri = "pack://application:,,,/Images/" + path;

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