Форма справки Windows Forms не отображается правильно с помощью метода Show ()C#

Место общения программистов C#
Anonymous
 Форма справки Windows Forms не отображается правильно с помощью метода Show ()

Сообщение Anonymous »

Я пытаюсь создать приложение для системного лотка, используя формы Windows, используя пользовательский класс SystemTrayApplicationContext (унаследованный от ApplicationContext), который запускается во время программы .CS: < /p>
SystemTrayApplicationContext appContext = new SystemTrayApplicationContext();
Application.ApplicationExit += appContext.HandleExit;
Application.Run(appContext);
< /code>
Приложение работает нормально только с элементами системы лотка, но теперь я хочу добавить экран справки после нажатия кнопки Gamepad (используя библиотеку Xinputium, входное чтение, работающее нормально). В настоящее время я реализую это программно с помощью простого экземпляра формы с помощью метки, созданной во время конструктора SystemTrayApplicationContext (конструктор также устанавливает Contextmenustrip и уведомление о приложении для панели задач). < /P>
using System;
using System.Drawing;
using System.Windows.Forms;
using XInputium;
using XInputium.XInput;

public class SystemTrayApplicationContext : ApplicationContext
{
private readonly XGamepad xinputDevice = new XGamepad();

private Form helpForm;

private NotifyIcon trayIcon;

private ContextMenuStrip contextMenuStrip;

private ToolStripMenuItem exitLabel;

public SystemTrayApplicationContext()
{
// Setup help screen
Label label = new Label();
label.Text = "test";
label.Size = new Size(300, 300);
label.Anchor = AnchorStyles.Left;
label.TextAlign = ContentAlignment.TopCenter;

this.helpForm = new Form();
this.helpForm.Size = label.Size;
this.helpForm.ShowInTaskbar = false;
this.helpForm.ShowIcon = false;
this.helpForm.ControlBox = false;
this.helpForm.FormBorderStyle = FormBorderStyle.None;
this.helpForm.StartPosition = FormStartPosition.CenterScreen;
this.helpForm.Controls.Add(label);

// SetupContextMenu
this.exitLabel = new ToolStripMenuItem("Exit");
this.exitLabel.Anchor = AnchorStyles.Right;
this.exitLabel.Click += this.HandleExit;

this.contextMenuStrip = new ContextMenuStrip();
this.contextMenuStrip.ShowImageMargin = false;
this.contextMenuStrip.Items.Add(exitLabel);

this.trayIcon = new NotifyIcon()
{
Icon = Properties.Resources.AppIcon,
Visible = true,
Text = "My System Tray App",
ContextMenuStrip = this.contextMenuStrip,
};

// Setup Xinput events
this.xinputDevice.ButtonPressed += this.HandleXinputButtonPressed;
this.xinputDevice.ButtonReleased += this.HandleXinputButtonReleased;
}

public void HandleExit(object sender, EventArgs e)
{
trayIcon.Visible = false;
Application.Exit();
}

private void HandleXinputButtonPressed(object sender, DigitalButtonEventArgs e)
{
if (e.Button.Button == XButtons.A)
{
this.helpForm.Show();
//this.helpForm.ShowDialog();
}
}

private void HandleXinputButtonReleased(object? sender, DigitalButtonEventArgs e)
{
if (e.Button.Button == XButtons.A)
{
this.helpForm.Hide();
}
}
}
< /code>
Проблема в том, что при показе формы справки с использованием show () появляется форма, но не метка. Если я использую ShowDialog (), он будет отображаться должным образом, но заморознет приложение, потому что оно не модально. Я не уверен, что вызывает проблему рендеринга в первом случае, так как я хотел бы использовать Show (). < /P>
с использованием show () < /p>
Использование showdialog () < /p>
в настоящее время у меня есть только одно событие для того, когда справочная клавиша впервые нажимается, а другое - когда она выпускается. Я звоню Show для формы, когда она нажимается и прячусь, когда она выпускается. Сама переменная формы - это просто частное поле, созданное внутри SystemTrayApplicationContext. Настройка видимой во внутренней метке, настройка свойств, таких как AutoSize, ActiveControl и цвет фона в форме, но ничего не имело эффекта.

Подробнее здесь: https://stackoverflow.com/questions/794 ... how-method

Вернуться в «C#»