Показ подсказки на несфокусированном ToolStripItem

Вы можете использовать AtomicBoolean в качестве окончательного здесь для использования во внутреннем классе, но поскольку функция асинхронная, возвращаемое значение входа в систему установлено неправильно, и вы должны изменить способ обработки вашего запроса на вход.

8
задан foson 30 December 2008 в 22:05
поделиться

3 ответа

Проблема состоит в том, что ToolStrip "средства управления" как ToolStripButton или ToolStripDropDownButton не наследовались Управлению. На данный момент я решил проблему путем фокусировки ToolStrip каждый раз, когда пользователь нависает над кнопкой. Событие MouseHover кнопки запущено слишком поздно - после того, как "выставочный код" подсказки был бы выполнен, таким образом, я расширил класс ToolStripDropDownButton и использовал мою новую кнопку. Этот метод должен работать на любой из других подобных кнопке классов, наследовавшихся ToolStripItem

public class ToolStripDropDownEx : ToolStripDropDownButton
{
    public ToolStripDropDownEx(string text)
    {
    }

    protected override void OnMouseHover(EventArgs e)
    {
        if (this.Parent != null)
            Parent.Focus();
        base.OnMouseHover(e);
    } 
}
5
ответ дан 5 December 2019 в 17:43
поделиться

Возможно, один из двух подходов в этом коде сбросит Вас с ноги в правильном направлении...

public Form1()
{
    InitializeComponent();

    tooltip = new ToolTip();
    tooltip.ShowAlways = true;
}

private ToolTip tooltip;
private void toolStripButton_MouseHover(object sender, EventArgs e)
{
    if (!this.Focused)
    {
        ToolStripItem tsi = (ToolStripItem)sender;
        tooltip.SetToolTip(toolStrip1, tsi.AutoToolTip ? tsi.ToolTipText : tsi.Text);
        /*tooltip.Show(tsi.AutoToolTip ? tsi.ToolTipText : tsi.Text, this, 
            new Point(toolStrip1.Left, toolStrip1.Bottom));*/
    }
}

private void toolStripButton_MouseLeave(object sender, EventArgs e)
{
    tooltip.RemoveAll();
}

Проблема с первым - Вы, не может установить его на кнопку непосредственно, это не наследовалось Управлению, и подсказка не обнаружится, если Вы не будете по полосе, но не по кнопке.

Проблема со вторым (прокомментировал путь) является им, не отображается вообще. Не совсем уверенный, почему, но возможно можно отладить его.

2
ответ дан 5 December 2019 в 17:43
поделиться

Я пытался сделать то же самое и решил, что это было довольно сложным и не стоящее того. Причина состоит в том, что внутренне, код.NET специально предназначен, чтобы только показать подсказку, если окно активно - они проверяют это на уровне Win32 так его попытка быть твердыми обмануть код.

Вот фрагмент кода в ToolTip.cs, который проверяет "GetActiveWindow ()" и возвращает false. Вы видите, что комментарий в коде "ToolTips нужно показать только на активных окнах".

Между прочим, Вы видите весь исходный код для BCL.NET с Visual Studio 2008, вот инструкции, которые я использовал:

http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx

// refer VsWhidbey 498263: ToolTips should be shown only on active Windows.
private bool IsWindowActive(IWin32Window window)
{ 
    Control windowControl = window as Control;
    // We want to enter in the IF block only if ShowParams does not return SW_SHOWNOACTIVATE. 
    // for ToolStripDropDown ShowParams returns SW_SHOWNOACTIVATE, in which case we DONT want to check IsWindowActive and hence return true. 
    if ((windowControl.ShowParams & 0xF) != NativeMethods.SW_SHOWNOACTIVATE)
    { 
        IntPtr hWnd = UnsafeNativeMethods.GetActiveWindow();
        IntPtr rootHwnd =UnsafeNativeMethods.GetAncestor(new HandleRef(window, window.Handle), NativeMethods.GA_ROOT);
        if (hWnd != rootHwnd)
        { 
            TipInfo tt = (TipInfo)tools[windowControl];
            if (tt != null && (tt.TipType & TipInfo.Type.SemiAbsolute) != 0) 
            { 
                tools.Remove(windowControl);
                DestroyRegion(windowControl); 
            }
            return false;
        }
    } 
    return true;
} 
1
ответ дан 5 December 2019 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: