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

XAML WPF -Why the background image of button does not change?

我是 XAML 的新手,我正在尝试更改按钮的背景图像。 所以,原来的背景图是heart.jpg。 我编写了函数 changeHearts() 来检查背景图像是否为: skull.png , 所以它会将按钮的图像更改为: heart.jpg 。 问题是当我调用这个函数时,它并没有改变按钮的图像。

*我的 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;
    }
}

The problem is that when I call the function, it does not change the image of the buttons. Please help me, any advice will be great.

那是因为您将 ImageBrush 个实例的 引用 == 运算符进行了比较。比较总是会失败,因为您在 XAML 和代码中定义的每个 ImageBrush 都是具有唯一引用的 distict 实例。因此,它们永远不相等。

I wrote function changeHearts() that suppose to check if the background image is: skull.png , So it will change the image of the button to: heart.jpg .

最简单的解决方法是根本不比较图像画笔。您的按钮有一个 SkullHearts 图像作为背景。现在,当您调用 changeHearts() 时,可能会发生两件事:

  • 一个按钮是 Skull,现在将更改为 Hearts
  • 一个按钮是 Hearts,现在将更改为 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>

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

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