У меня есть пользовательский элемент управления с RichTextBox и двумя кнопками на нем. Я пытаюсь показать это в ToolStripDropDown при нажатии ToolStripButton. Я использую ToolStripControlHost, чтобы поместить свой контроль в ToolStripDrowDown. Когда я нажимаю ToolStripButton на панели инструментов формы, я показываю раскрывающийся список в некоторой позиции и фокусируюсь на элементе управления ToolStripControlHost. Указатель мыши остается над ToolStripButton, а курсор - на RichTextBox. Но когда я начинаю редактировать RichTextBox, указатель мыши исчезает, и я вижу его только тогда, когда он не в форме прямоугольника. Как я могу это исправить?
Вот мой код:
private void toolBtnNote_Click(object sender, EventArgs e)
{
dropDownClosed = false;
noteChanged = false;
tsdd = new ToolStripDropDown();
this.tsdd.Opened += new EventHandler(tsdd_Opened);
this.tsdd.AutoSize = true;
NoteEdit ne = new NoteEdit();
ne.NoteText = note ?? "";
// appears when user clicks first button at my control
ne.OkClick += new NoteEdit.NoteEditEvent(ne_OkClick);
// appears when user clicks second button at my control
ne.CancelClick += new NoteEdit.NoteEditEvent(ne_CancelClick);
this.tbh = new ToolStripControlHost(ne, "noteEdit");
this.tbh.Padding = new Padding(0);
this.tbh.AutoSize = false;
this.tbh.Size = ne.Size;
this.tsdd.Items.Add(tbh);
this.tsdd.Padding = new Padding(0);
this.tsdd.Closing += new ToolStripDropDownClosingEventHandler(tsdd_Closing);
// show toolstripdrowdown at specific position at DataGridView
this.tsdd.Show(dgvMarks, cellRect.Location + new Size(0, cellRect.Height));
while (!this.dropDownClosed)
{
Application.DoEvents();
}
if(noteChanged) {...}
}
void ne_CancelClick()
{
tsdd.Close();
}
void ne_OkClick()
{
noteChanged = true;
tsdd.Close();
}
void tsdd_Opened(object sender, EventArgs e)
{
tbh.Focus();
}
void tsdd_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
dropDownClosed = true;
}
2 ответа
Я нашел решение. Не лучший, но работает. Я просто имитирую щелчок на показанном RichTextBox с помощью WinApi следующим образом:
public class WinApiHelper
{
private const UInt32 MOUSEEVENTF_LEFTDOWN = 0x0002;
private const UInt32 MOUSEEVENTF_LEFTUP = 0x0004;
[DllImport("user32.dll")]
private static extern void mouse_event(
UInt32 dwFlags, // motion and click options
UInt32 dx, // horizontal position or change
UInt32 dy, // vertical position or change
UInt32 dwData, // wheel movement
IntPtr dwExtraInfo // application-defined information
);
public static void SendClick(Point location)
{
Cursor.Position = location;
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, new System.IntPtr());
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, new System.IntPtr());
}
}
private void toolBtnNote_Click(object sender, EventArgs e)
{
dropDownClosed = false;
noteChanged = false;
dgvMarks.Focus();
tsdd = new ToolStripDropDown();
this.tsdd.Opened += new EventHandler(tsdd_Opened);
this.tsdd.AutoSize = true;
NoteEdit ne = new NoteEdit();
ne.NoteText = note ?? "";
ne.OkClick += new NoteEdit.NoteEditEvent(ne_OkClick);
ne.CancelClick += new NoteEdit.NoteEditEvent(ne_CancelClick);
this.tbh = new ToolStripControlHost(ne, "noteEdit");
this.tbh.Padding = new Padding(0);
this.tbh.AutoSize = false;
this.tbh.Size = ne.Size;
this.tsdd.Items.Add(tbh);
this.tsdd.Padding = new Padding(0);
this.tsdd.Closing += new ToolStripDropDownClosingEventHandler(tsdd_Closing);
this.tsdd.Show(dgvMarks, cellRect.Location + new Size(0, cellRect.Height));
// emulate click on richtextbox at dropdown
WinApiHelper.SendClick(tsdd.Location + new Size(ne.Rtb.Location) + new Size(5, 5));
while (!this.dropDownClosed)
{
Application.DoEvents();
}
if (noteChanged)
{...}
}
Курсор мыши скрывается, когда вы начинаете редактировать TextBox или RichTextBox, - это нормальное поведение. Он должен восстанавливаться при перемещении мыши. Также следует отметить, что вызов Cursor.Show a> не сработает, если вы попытаетесь вызвать его в TextChanged или в чем-то подобном.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.