C# 如何显示和隐藏具有相同键的窗体?

C# 如何显示和隐藏具有相同键的窗体?,c#,forms,C#,Forms,我正在用表单制作一个RPG游戏,但我不知道如何用一个键显示和隐藏特定的表单。例如,当我按下“C”键时,我希望它显示带有PlayerInfo面板的窗体,当我再次按下“C”键时,我希望它隐藏窗体 private void KeyPress(object sender, KeyEventArgs e) { PlayerInfo playerInfo = new PlayerInfo(this); bool visible = false; if

我正在用表单制作一个RPG游戏,但我不知道如何用一个键显示和隐藏特定的表单。例如,当我按下“C”键时,我希望它显示带有PlayerInfo面板的窗体,当我再次按下“C”键时,我希望它隐藏窗体

private void KeyPress(object sender, KeyEventArgs e)
    {
        PlayerInfo playerInfo = new PlayerInfo(this);
        bool visible = false;

        if (e.KeyCode == Keys.C)
        {
            if (visible == false)
            {
                playerInfo.Show();
                visible = true;
            } 
        }

        if (e.KeyCode == Keys.C)
        {
            if (visible)
            {
                playerInfo.Hide();
                visible = false;
            }
        }
    }

你需要一个if/else语句,现在if和else都被调用,所以当你按下键的时候,你会在同一个调用中显示并隐藏它

bool visible = false;

private void KeyPress(object sender, KeyEventArgs e)
{
    PlayerInfo playerInfo = new PlayerInfo(this);


    if (e.KeyCode == Keys.C)
    {
        if (visible == false)
        {
            playerInfo.Show();
            visible = true;
        } 
        else if (visible)
        {
            playerInfo.Hide();
            visible = false;
        }
    }
}

对不起,我没有注意到你的可见变量是一个局部变量。您需要将其设置为类变量,并在构建对象时设置它。如果您在回调中初始化它,您将始终将其设置为false。

您需要一个If/else语句,此时两个If都会被调用,因此当您按键时,您会在同一个调用中显示并隐藏它

bool visible = false;

private void KeyPress(object sender, KeyEventArgs e)
{
    PlayerInfo playerInfo = new PlayerInfo(this);


    if (e.KeyCode == Keys.C)
    {
        if (visible == false)
        {
            playerInfo.Show();
            visible = true;
        } 
        else if (visible)
        {
            playerInfo.Hide();
            visible = false;
        }
    }
}

对不起,我没有注意到你的可见变量是一个局部变量。您需要将其设置为类变量,并在构建对象时设置它。如果您在回调中初始化它,您将始终将其设置为false。

我将在PlayerInfo类中添加一个名为
toggle的方法和属性

 public class PlayerInfo { 
       // your stuff
       public bool IsVisible {get;set;}
       public void Toggle() {
             if (IsVisible)
                   Hide()
             else
                   Show()
             IsVisible = !IsVisible
       }
 }

我将在PlayerInfo类中添加一个名为
toggle

 public class PlayerInfo { 
       // your stuff
       public bool IsVisible {get;set;}
       public void Toggle() {
             if (IsVisible)
                   Hide()
             else
                   Show()
             IsVisible = !IsVisible
       }
 }
使用您的代码,您将始终获得它的可见性,直到您
作为全局变量可见。可能
playerInfo
也是全局的,否则每次都会是一个新实例

全球宣言:

bool visible = false;
PlayerInfo playerInfo = new PlayerInfo(this);
按键
方法签名:

private void KeyPress(object sender, KeyEventArgs e)
{
 if (e.KeyCode == Keys.C)
    {
        if (!visible)
        {
            playerInfo.Show();
            visible = true;
        } 
        else
        {
            playerInfo.Hide();
            visible = false;
        }
    }
}
使用您的代码,您将始终获得它的可见性,直到您
作为全局变量可见。可能
playerInfo
也是全局的,否则每次都会是一个新实例

全球宣言:

bool visible = false;
PlayerInfo playerInfo = new PlayerInfo(this);
按键
方法签名:

private void KeyPress(object sender, KeyEventArgs e)
{
 if (e.KeyCode == Keys.C)
    {
        if (!visible)
        {
            playerInfo.Show();
            visible = true;
        } 
        else
        {
            playerInfo.Hide();
            visible = false;
        }
    }
}


回答很好-但是如果(可见)
是多余的(它可以只是一个
)。这不起作用,你总是将visible设置为false。更改
visible
变量的范围,它就会起作用。是的,很抱歉,我没有意识到在你的回调中设置了visible,正如其他评论员所指出的,您需要移出方法的范围,这样就不会在每次调用回调时都设置它。仍然不起作用,现在它需要按两次键才能显示表单。奇怪。回答得很好-但是如果(可见)
是多余的(它可以只是一个
)。这不起作用,你总是将可见设置为false。更改
可见
变量的范围,它就会起作用。是的,很抱歉,我没有意识到在你的回调中设置了可见,正如其他评论员所指出的,您需要移出方法的范围,这样就不会在每次调用回调时都设置它。仍然不起作用,现在它需要按两次键才能显示表单。奇怪。我把布尔值移到了方法之外,它仍然不起作用。现在需要按键来显示表单,但它根本不会隐藏表单。单独移动布尔变量不会产生好的结果。因为
playerInfo
将在每次按键时实例化。所以你需要把它的范围扩大到全球。当我将playerInfo移到它给我的ObjectDisposed异常的方法之外时,请参见我的回答中的更新。我找到了问题所在。现在它开始工作了。谢谢我将布尔值移到方法之外,但它仍然不起作用。现在需要按键来显示表单,但它根本不会隐藏表单。单独移动布尔变量不会产生好的结果。因为
playerInfo
将在每次按键时实例化。所以你需要把它的范围扩大到全球。当我将playerInfo移到它给我的ObjectDisposed异常的方法之外时,请参见我的回答中的更新。我找到了问题所在。现在它开始工作了。谢谢