C# 在wpf c中单击时更改按钮图像

C# 在wpf c中单击时更改按钮图像,c#,wpf,xaml,C#,Wpf,Xaml,我正在使用xaml和c为windows 8.1应用商店创建一个tic-tac-toe游戏,并试图在单击时更改X和O按钮。最初,我在xaml中为按钮设置了一个空白图像,在button_click事件中,我试图更改图像源。以下是我的代码片段: private void Button_Click(object sender, RoutedEventArgs e) { Button btn = sender as Button; if (turn == 1)

我正在使用xaml和c为windows 8.1应用商店创建一个tic-tac-toe游戏,并试图在单击时更改X和O按钮。最初,我在xaml中为按钮设置了一个空白图像,在button_click事件中,我试图更改图像源。以下是我的代码片段:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        Button btn = sender as Button;
        if (turn == 1)
        {
            BitmapImage bmp = new BitmapImage();
            Uri u = new Uri("ms-appx:/Images/O_logo.png", UriKind.RelativeOrAbsolute);
            bmp.UriSource = u;
            ImageBrush i = new ImageBrush();
            i.ImageSource = bmp;
            btn.Background = i;
        }
        else
        {
            BitmapImage bmp = new BitmapImage();
            Uri u = new Uri("ms-appx:/Images/X_logo.png", UriKind.RelativeOrAbsolute);
            bmp.UriSource = u;
            ImageBrush i = new ImageBrush();
            i.ImageSource = bmp;
            btn.Background = i;

        }
        btn.IsEnabled = false;
        //win(btn.Content.ToString());
        turn += 1;
        if (turn > 2)
            turn = 1;
    }
我在网上读了几篇文章,其中一些建议我将图像的构建操作设置为Resource,但是我没有这个选项。我可以选择PRIResource和嵌入式资源。我对mvvm和触发器的了解非常有限,因此希望使用wpf本身而不是xaml来解决这个问题


我正在使用VS Studio Professional 2013

我在WPF中做了一些非常类似的事情,不是tic tac toe,而是有多个数据网格,每个数据网格都有一个不同的背景,占据完全相同的位置,然后通过一个按钮启用/禁用。我会写下一些代码,但我不知道wpf的顶部我的头脑像我做winforms,他们是非常不同的主要区别是wpf是垃圾相比

但有点像:

button1_click(object sender, EventArgs e)
{
    if (turn == 1)
    {
        gridX.Visibility = visible;
    }
    else
    {
        gridO.Visibility = visible;

    }
    button1.Visibility = hidden;
}

然后只需将图像放入网格、标签或w/e

中,我在WPF中做了一些非常类似的事情,不是tic tac toe,而是有多个数据网格,每个网格都有一个不同的背景,占据完全相同的位置,然后通过一个按钮启用/禁用。我会写下一些代码,但我不知道wpf的顶部我的头脑像我做winforms,他们是非常不同的主要区别是wpf是垃圾相比

但有点像:

button1_click(object sender, EventArgs e)
{
    if (turn == 1)
    {
        gridX.Visibility = visible;
    }
    else
    {
        gridO.Visibility = visible;

    }
    button1.Visibility = hidden;
}
然后,只需将图像放入网格或标签中,或者在禁用按钮时不显示w/e

背景。您应该将图像作为按钮内容:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button btn = sender as Button;
    if (turn == 1)
    {
        BitmapImage bmp = new BitmapImage();
        Uri u = new Uri("ms-appx:/Images/O_logo.png", UriKind.RelativeOrAbsolute);
        bmp.UriSource = u;
        // NOTE: change starts here
        Image i = new Image();
        i.Source = bmp;
        btn.Content = i;
    }
    else
    {
        BitmapImage bmp = new BitmapImage();
        Uri u = new Uri("ms-appx:/Images/X_logo.png", UriKind.RelativeOrAbsolute);
        bmp.UriSource = u;
        // NOTE: change starts here
        Image i = new Image();
        i.Source = bmp;
        btn.Content = i;

    }
    btn.IsEnabled = false;
    //win(btn.Content.ToString());
    turn += 1;
    if (turn > 2)
        turn = 1;
}
我还强烈建议您学习并开始使用XAML和绑定,而不是回避它。你实际上是在用你使用WPF的方式来对抗它,这让你自己变得更加困难。如果按预期使用,您可能会发现它优于Windows窗体。

禁用该按钮时,不会显示背景。您应该将图像作为按钮内容:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button btn = sender as Button;
    if (turn == 1)
    {
        BitmapImage bmp = new BitmapImage();
        Uri u = new Uri("ms-appx:/Images/O_logo.png", UriKind.RelativeOrAbsolute);
        bmp.UriSource = u;
        // NOTE: change starts here
        Image i = new Image();
        i.Source = bmp;
        btn.Content = i;
    }
    else
    {
        BitmapImage bmp = new BitmapImage();
        Uri u = new Uri("ms-appx:/Images/X_logo.png", UriKind.RelativeOrAbsolute);
        bmp.UriSource = u;
        // NOTE: change starts here
        Image i = new Image();
        i.Source = bmp;
        btn.Content = i;

    }
    btn.IsEnabled = false;
    //win(btn.Content.ToString());
    turn += 1;
    if (turn > 2)
        turn = 1;
}

我还强烈建议您学习并开始使用XAML和绑定,而不是回避它。你实际上是在用你使用WPF的方式来对抗它,这让你自己变得更加困难。如果按预期使用,您可能会发现它优于Windows窗体。

为什么不使用带有X&O的切换按钮来检查IsChecked true/false状态?这样似乎是额外的工作。如果我使用切换按钮,当玩家可以选择X和另一个回合时,我如何确定要显示的图像,玩家可以选择O。我想我必须在这种情况下绑定数据,对吗?最初我还需要这个按钮来显示一个空白图像,因此它有3种状态。布兰克、X和欧威尔这东西不应该构成太大的挑战。然后你可以根据哪个玩家的状态把他们的状态扔到树下。那么这需要我绑定数据或者使用触发器?我真的不知道该怎么做。我会将IsThrestate属性设置为True,以及如何设置xaml或.cs文件中每个状态的值?你可以双向绑定IsChecked状态,并根据player1或player2是否会将其设置为IsChecked=True或False或x:Null来确定玩家点击事件,但我可能过于复杂了lol,在这一点上,我们必须反复思考一分钟。为什么不使用带有X&O的切换按钮来检查IsChecked的真/假状态呢?这样似乎是额外的工作。如果我使用切换按钮,当玩家可以选择X和另一个回合时,我如何确定要显示的图像,玩家可以选择O。我想我必须在这种情况下绑定数据,对吗?最初我还需要这个按钮来显示一个空白图像,因此它有3种状态。布兰克、X和欧威尔这东西不应该构成太大的挑战。然后你可以根据哪个玩家的状态把他们的状态扔到树下。那么这需要我绑定数据或者使用触发器?我真的不知道该怎么做。我会将IsThrestate属性设置为True,以及如何设置xaml或.cs文件中每个状态的值?你可以双向绑定IsChecked状态,并根据player1或player2是否会将其设置为IsChecked=True或False或x:Null来确定玩家点击事件,但我可能过于复杂了lol,我得在这个上面再熬一分钟。是的,谢谢你的建议。当我意识到我将不得不在我的箱子中制作许多网格或按钮,并将它们的可见性设置为折叠或可见时,我也在做同样的事情。似乎有很多xaml代码,因此我想自己修改.cs文件中的图像。WPF是复杂的,在winforms中,它非常简单:button1.Image=Namespace.Properties.Resources.imageName;是的,谢谢你的建议。当我意识到我将不得不在我的箱子中制作许多网格或按钮并设置它们的可见性时,我也在做同样的事情
倒塌或可见。似乎有很多xaml代码,因此我想自己修改.cs文件中的图像。WPF是复杂的,在winforms中,它非常简单:button1.Image=Namespace.Properties.Resources.imageName;非常感谢你。这很好用。是的,我将开始学习装订和XAML More。非常感谢。这很好用。是的,我将开始学习绑定和XAML更多