我是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
分配一个当前显示的标识符,Hearts或Skull。这可以是自定义的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;
}