У меня есть форма с закрепленной картинкой, чтобы заполнить все это.В этой форме у меня есть панель, которая обычно невидима, и другая картинка;на панели у меня есть ярлык и еще одна панель с ярлыком.
Вот что ДОЛЖНО произойти, когда пользователь наводит курсор мыши на второй блок изображения:
- Изображение в блоке изображения меняется, и становится видимой первая панель, что делает видимыми вторую панель и обе метки
- Пользователь нажимает на вторую метку
- Обработчик OnClick второй метки изменяет текст первой метки, а вторая панель становится невидимой
- Таймер срабатывает на несколько секунд
- Сегмент кода в обработчике OnTick таймера приводит к изменению изображения во втором блоке изображений и превращению первой панели в невидимый
Вот что происходит:
- Изображение в окне рисунка изменяется, и первая панель становится видимой, что делает вторую панель и обе метки видимыми тоже
- Пользователь нажимает на вторую метку
- Обработчик OnClick второй метки устанавливает первую меткуtext в новую строку и устанавливает свойство Visible второй панели в false, НО вторая панель остается visible (хотя вы не можете с ним взаимодействовать), и текст первой метки пишется поверх старого текста
- Таймер тикает на несколько секунд
- Сегмент кода в OnTick таймераобработчик вызывает изменение изображения во втором окне изображения, и первая панель становится невидимой
Я перепробовал все, что мог придумать.Я назвал Invalidate, Update и Refresh для каждого элемента управления в форме, я назвал Application.DoEvents, я сбросил изображение на фоне PictureBox на себя, ничего.ДЕЙСТВИТЕЛЬНО странная часть состоит в том, что на шаге 5, когда передняя панель изображений перезагружается и все панели устанавливаются невидимыми, ничто не остается позади - только на те короткие несколько секунд между завершением обработчика OnClick и очисткой таймера OnTick возникают проблемы,Я могу отредактировать это для получения дополнительной информации, если это необходимо, но есть ли у кого-нибудь идеи, что делать?
Редактировать: Мне было указано, что я, вероятно, должен загрузить код для этого.Ну, этот код взломан, но все в порядке.Кроме того: есть некоторые странные дополнительные биты (в перечислении типов среди других), они для более поздних частей проекта и не имеют значения прямо сейчас.
bool CountingHoverTime = false;
int HoverTime = 0;
int MasterTick = 0;
enum GhostState { Stand, Speak, Pet, Ask };
GhostState curState;
public enum TalkType { HoverGen, Petted, Spont, TimerMsg, Response };
private void Form1_Load(object sender, EventArgs e)
{
FormBorderStyle = FormBorderStyle.None;
ShowInTaskbar = false;
TopMost = true;
ControlBox = false;
Text = String.Empty;
WindowState = FormWindowState.Maximized;
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;
this.TransparencyKey = Color.Transparent;
}
protected override void OnPaintBackground(PaintEventArgs e)
{
//base.OnPaintBackground(e);
}
private void pictureBox2_MouseHover(object sender, EventArgs e)
{
if(curState == GhostState.Stand)
{
CountingHoverTime = true;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if((curState != GhostState.Ask) && (curState != GhostState.Stand))
{
MasterTick++;
if(MasterTick > 10)
{
SetToBasic();
}
}
else
{
MasterTick = 0;
}
if (CountingHoverTime)
{
HoverTime++;
if (HoverTime > 4)
{
HoverTime = 0;
curState = GhostState.Ask;
Say("What can I do for you?", TalkType.HoverGen);
}
}
}
public void SetToBasic()
{
curState = GhostState.Stand;
ghostBox.Image = Properties.Resources.stickStand1;
TalkPanel.Visible = false;
}
public void Say(String speak, TalkType type)
{
mainText.Text = speak;
if(type == TalkType.Response || type == TalkType.Spont)
{
curState = GhostState.Speak;
}
else
{
curState = GhostState.Ask;
}
ghostBox.Image = Properties.Resources.stickTalk;
if (type == TalkType.HoverGen)
OptionPanel.Visible = true;
else
OptionPanel.Visible = false;
TalkPanel.Visible = true;
backBox.Image = Properties.Resources.background;
ghostBox.Invalidate();
TalkPanel.Invalidate();
mainText.Invalidate();
backBox.Invalidate();
ghostBox.Update();
TalkPanel.Update();
mainText.Update();
backBox.Update();
Application.DoEvents();
}
private void op1label_Click(object sender, EventArgs e)
{
curState = GhostState.Speak;
OptionPanel.Visible = false;
Say("No can do yet.", TalkType.Response);
}
Редактировать 2: я собрал гифкувизуализация происходящего, спасибо HandbagCrab.
![This is a demonstration of what's going wrong.](https://i.stack.imgur.com/Zfwmr.gif)