2009-06-17 103 views
16

如何将此按钮添加到WPF中的标题栏中,通过它在很多应用程序中如此使用,我认为它将内置于其中或其他东西,但看起来不是这样。无论如何,让我知道你是否知道这件事。帮助“?”按钮

谢谢。

编辑:

是不是有什么事情等同于this

基本上,要有?图标在胜利形式,所有你需要做的是这样的:

public Form1() 
{ 
    InitializeComponent(); 

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

不是WPF有这样的事情吗?

+0

为什么标题栏?我看到的大多数应用都将它放在菜单栏中。 – 2009-06-17 23:48:39

+1

事情是我们将主要在对话框窗口上使用它,它通常没有菜单栏。点击它将为该窗口提供上下文帮助。就像在MS Word 2007中的字体对话框窗口中一样。 – Carlo 2009-06-18 00:17:36

回答

30

这很简单,只需将此代码插入到Window类中即可。

此代码使用interop删除WS_MINIMIZEBOX和WS_MAXIMIZEBOX样式并添加WS_EX_CONTEXTHELP扩展样式(只有在删除最小化和最大化按钮时才会显示问号)。

编辑:在帮助按钮上添加了单击检测,这是通过使用HwndSource.AddHook挂接到WndProc并使用wParam的SC_CONTEXTHELP侦听WM_SYSCOMMAND消息来完成的。

当检测到单击时,此代码将显示一个消息框,将其更改为事件,路由事件或命令(对于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

WPF没有帮助按钮。但是不应该推动自己推出自己的产品。

+0

到标题栏?好像你需要改变Window chrome,这是记录的,但不是微不足道的。 – micahtan 2009-06-17 23:27:38

0

如果您打算将按钮添加到非客户端区域,请参阅this article