C# 如何显示和隐藏具有相同键的窗体?
我正在用表单制作一个RPG游戏,但我不知道如何用一个键显示和隐藏特定的表单。例如,当我按下“C”键时,我希望它显示带有PlayerInfo面板的窗体,当我再次按下“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
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异常的方法之外时,请参见我的回答中的更新。我找到了问题所在。现在它开始工作了。谢谢