XAML WPF-为什么按钮的背景图像没有改变



我是XAML的新手,正在尝试更改按钮的背景图像。因此,原始背景图像是heart.jpg。我写了函数changeHearts((,假设检查背景图像是否为:skull.png,因此,它会将按钮的图像更改为:heart.jpg。问题是,当我调用该函数时,它不会更改按钮的图像。

  • 这两个图像属性都设置为:resource

*我的c#代码中的函数:

private void changeHearts()
{
Uri resourceUri = new Uri("/Images/skull.png", UriKind.Relative);
StreamResourceInfo streamInfo = Application.GetResourceStream(resourceUri);
BitmapFrame temp = BitmapFrame.Create(streamInfo.Stream);
var brush2 = new ImageBrush();
brush2.ImageSource = temp;

Uri resourceUri1 = new Uri("/Images/heart.jpg", UriKind.Relative);
StreamResourceInfo streamInfo1 = Application.GetResourceStream(resourceUri1);
BitmapFrame temp1 = BitmapFrame.Create(streamInfo1.Stream);
var brush = new ImageBrush();
brush.ImageSource = temp1;


foreach (Button btn in split1.Children)
{
if (btn.Background == brush2)
btn.Background = brush;

}
foreach (Button btn in split2.Children)
{
if (btn.Background == brush2)
btn.Background = brush;
}
}

问题是,当我调用函数时,它不会更改按钮的图像。请帮帮我,任何建议都很好。

这是因为您将ImageBrush实例的引用与==运算符进行比较。比较总是会失败,因为您在XAML和代码中定义的每个ImageBrush都是具有唯一引用的distict实例。因此,他们从来都不是平等的。

我写了函数changeHearts((,假设检查背景图像是否为:skull.png,所以它会将按钮的图像更改为:heart.jpg。

最简单的解决方案是根本不比较图像笔刷。你的按钮要么有一个骷髅,要么有一张红心图像作为背景。现在,当您调用changeHearts()时,可能会发生两件事:

  • 一个按钮是Skull,现在将更改为Hearts
  • 一个按钮是红心大战,现在将更改为

在这两种情况下,结果都是相应的按钮将是Hearts,因此您可以删除检查并获得相同的结果。


比较笔刷很难,因为Equals方法也无法做到这一点。您必须创建自定义的比较逻辑,例如,在笔刷上查找属性进行比较,但我不推荐它。

另一种选择是为按钮的Tag分配一个当前显示的标识符,HeartsSkull。这可以是自定义的enum或简单的string,例如:

public enum ButtonType
{
Skull,
Hearts
}

然后将初始按钮类型分配给XAML中的按钮:

<Button x:Name="XLife1" Tag="{x:Static local:ButtonType.Hearts}" Grid.Column="0" Width="80" Height="80">
<Button.Background>
<ImageBrush ImageSource="/images/heart.jpg"/>
</Button.Background>
</Button>

Adpat您的方法来检查按钮的Tag属性,如果匹配则更改标记:

if (btn.Tag.Equals(ButtonType.Hearts))
{
btn.Tag = ButtonType.Skull;
btn.Background = brush;
}

最新更新