2012-01-26 8 views
0

У меня есть кнопка, которая запускает процесс с интенсивным временем. Когда пользователь нависает над этой кнопкой, отображается подсказка, что хорошо. Однако, прежде чем этот процесс будет перенаправлен на фоновый поток (примерно 10 секунд или около того для некоторых вещей), подсказка отображается полупрозрачной. Я знаю, что это ужасное кодирование, и оно должно быть добавлено к не-пользовательскому потоку ASAP, но так оно и есть на данный момент ...Как завершить отображение всплывающей подсказки кнопок

Мой вопрос в том, как я могу получить ссылку на инструмент кнопок -tip, чтобы я мог сделать его невидимым? Я предполагаю, что это выглядит следующим образом:

ToolTip someTT = Button.ToolTip; // This only gets or set the tool tip text. 
someTT.Active = false; 
someTT.Dispose(); // As a last resort. 

Извините, ребята, я aknowledge, что я отвратительный человек для этого.

Редактировать: Эта кнопка представляет собой компонент ComponentOne RibbonButton как часть Studio for WinForms.

ответ

2

Обычно, когда вы работаете с ToolTip, вы можете найти следующий код в методе Form.InitializeComponent():

this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); 
this.button1 = new System.Windows.Forms.Button(); 
//... 
this.toolTip1.SetToolTip(this.button1, "Tooltip for button1"); 

Таким образом, вы можете отключить всплывающую подсказку для определенной кнопки, используя тот же подход:

this.toolTip1.SetToolTip(this.button1, null); 

Вы также можете отключить кнопку при запуске фоновой нити. Это также позволяет избежать ненужных всплывающих подсказок над этой кнопкой:

void button1_Click(object sender, EventArgs e) { 
    toolTip1.Hide(button1); 
    button1.Enabled = false; 
    //start the background thread here 
} 
+0

Спасибо за ваш ответ. Однако из-за SDK, который я использую (ComponantOne), я не могу найти ссылку на общую подсказку для элементов управления. Если бы я мог, ты был бы очень аккуратным ответом. Я установил подсказки для кнопок (ленты) через конструктор, и неясно, как получить доступ к фактическому объекту подсказки. Есть идеи? Спасибо за ваше время. – MoonKnight

+0

Вы должны обновить свой вопрос информацией об элементах управления ComponentOne. В любом случае, установив значение «null» для свойства RibbonButton.Tooltip или значение «false» для свойства RibbonButton.Enabled, следует избегать всплывающих подсказок (я не знаю фактическую архитектуру движка подсказок C1, но я считаю, что нет необходимости в доступе объект ToolTip непосредственно в вашем случае). – DmitryG

1

Вам необходимо работать с элементом управления ToolTip, который вы добавили в ваш проект. Что-то вроде ToolTip.Active может работать.

Из выше ссылки:

С активной собственностью, вы можете включить или отключить отображение ToolTip текста для всех элементов управления, которые имеют текст, заданное этим конкретного компонента ToolTip. Хотя более чем один компонент ToolTip может быть создан и назначен форме, установка значения Active для false влияет только на текущую подсказку.

0

Если поток пользовательского интерфейса выполняет работу, то не имеет значения, если вы найдете способ скрыть кончик инструмента, он все равно не будет выполняться до тех пор, пока поток пользовательского интерфейса не будет снова освобожден.

Ваше решение - это то, что вы всегда знали, это переместить обработку, отличную от UI, в поток, отличный от UI.

+0

Это не ответ на вышеуказанный вопрос. – MoonKnight

+0

@ Killercam Я предположил, что он пытался скрыть подсказку инструмента после нажатия кнопки, а не целиком, пока она не появится. Тот факт, что он говорит, что всплывающая подсказка хороша, когда зависание, похоже, поддерживает эту веру. Если мы предположим, что он пытается скрыть всплывающую подсказку в событии click, и он также выполняет 10-секундную работу в этом событии click, тогда любые изменения пользовательского интерфейса не будут происходить, пока они не станут слишком поздно. Таким образом, ответ на его вопрос заключается в том, что на него нельзя ответить, учитывая его ограничения. – Servy

+0

У вас это правильно в том, что я хотел. Это может быть сделано. Просто из-за того, что некоторая обработка выполняется в UI-потоке, не означает, что я не могу использовать тот же поток для обновления/перерисовки некоторых графических элементов и т. Д. Чтобы проиллюстрировать, я могу вызвать некоторую трудную работу над пользовательским интерфейсом -> «Сделайте тяжелую работу ...', а затем на полпути -> 'myControl.Update()', это приведет к перерисовке 'myControl'; за счет моей обработки. Спасибо за ваше время безрезультатно, это ценится ... – MoonKnight

Смежные вопросы