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

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

17 голосов
/ 18 июня 2009

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

Спасибо.

Edit:

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

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

public Form1()
{
    InitializeComponent();

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

Разве у WPF нет ничего подобного?

Ответы [ 3 ]

33 голосов
/ 19 июня 2009

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

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

РЕДАКТИРОВАТЬ: добавлено обнаружение щелчка по кнопке справки, это делается путем подключения к 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;
}
0 голосов
/ 18 июня 2009

Если вы собираетесь добавить кнопку в область, не относящуюся к клиенту, взгляните на эту статью .

0 голосов
/ 18 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...