Помогите "?" кнопка

Как добавить эту кнопку в строку заголовка в WPF, так как она используется во многих приложениях, я думал, что она будет встроена или что-то еще, но похоже, что это не так. В любом случае, дайте мне знать, если вы знаете что-нибудь об этом.

Спасибо.

Edit:

Разве нет ничего эквивалентного this?

В принципе, иметь? значок в форме выигрыша, все, что вам нужно сделать, это следующее:

public Form1()
{
    InitializeComponent();

    this.HelpButton = true;
    this.MaximizeBox = false;
    this.MinimizeBox = false;
}

У WPF есть что-то подобное?

Ответы

Ответ 1

Это просто, просто вставьте этот код в свой класс Window.

Этот код использует interop для удаления стилей WS_MINIMIZEBOX и WS_MAXIMIZEBOX и добавления расширенного стиля WS_EX_CONTEXTHELP (знак вопроса будет отображаться только в том случае, если вы удалите кнопки минимизации и максимизации).

EDIT: добавлено обнаружение щелчка на кнопке справки, это делается путем подключения к WndProc с помощью HwndSource.AddHook и прослушивания сообщения WM_SYSCOMMAND с помощью wParam SC_CONTEXTHELP.

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

private const uint WS_EX_CONTEXTHELP = 0x00000400;
private const uint WS_MINIMIZEBOX = 0x00020000;
private const uint WS_MAXIMIZEBOX = 0x00010000;
private const int GWL_STYLE = -16;
private const int GWL_EXSTYLE = -20;
private const int SWP_NOSIZE = 0x0001;
private const int SWP_NOMOVE = 0x0002;
private const int SWP_NOZORDER = 0x0004;
private const int SWP_FRAMECHANGED = 0x0020;
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_CONTEXTHELP  = 0xF180;


[DllImport("user32.dll")]
private static extern uint GetWindowLong(IntPtr hwnd, int index);

[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hwnd, int index, uint newStyle);

[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int width, int height, uint flags);


protected override void OnSourceInitialized(EventArgs e)
{
    base.OnSourceInitialized(e);
    IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
    uint styles = GetWindowLong(hwnd, GWL_STYLE);
    styles &= 0xFFFFFFFF ^ (WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
    SetWindowLong(hwnd, GWL_STYLE, styles);
    styles = GetWindowLong(hwnd, GWL_EXSTYLE);
    styles |= WS_EX_CONTEXTHELP;
    SetWindowLong(hwnd, GWL_EXSTYLE, styles);
    SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);   
    ((HwndSource)PresentationSource.FromVisual(this)).AddHook(HelpHook);
}

private IntPtr HelpHook(IntPtr hwnd,
        int msg,
        IntPtr wParam,
        IntPtr lParam,
        ref bool handled)
{
    if (msg == WM_SYSCOMMAND &&
            ((int)wParam & 0xFFF0) == SC_CONTEXTHELP)
    {
        MessageBox.Show("help");
        handled = true;
    }
    return IntPtr.Zero;
}

Ответ 2

Никакие кнопки справки не входят в комплект поставки с WPF. Не должно быть толчка, чтобы катиться самостоятельно.

Ответ 3

Если вы намерены добавить кнопку в неклиентскую область, посмотрите в этой статье.