2009-06-17 6 views
16

このボタンをWPFのタイトルバーに追加するにはどうすればいいですか?それは多くのアプリケーションで使用されているので、それは内蔵されていると思っていましたが、そうではないように見えます。あなたはこれについて何か知っていればとにかく私に知らせてください。ヘルプ "?"ボタン

ありがとうございました。

編集:

thisと同等のものはありませんか?

基本的には?あなたがする必要があるのは次のとおりです:

public Form1() 
{ 
    InitializeComponent(); 

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

WPFには何もありませんか?

+0

なぜタイトルバーですか?私が見るほとんどのアプリはメニューバーに置いてあります。 –

+1

私たちは主にメニューバーを持っていないダイアログウィンドウでそれを使うつもりです。これをクリックすると、そのウィンドウのコンテキストヘルプが表示されます。フォントダイアログウィンドウでMS Word 2007のようなもの。 – Carlo

答えて

30

これはシンプルで、このコードをWindowクラスに挿入するだけです。

このコードでは、interopを使用してWS_MINIMIZEBOXおよびWS_MAXIMIZEBOXスタイルを削除し、WS_EX_CONTEXTHELP拡張スタイルを追加します(最小化および最大化ボタンを削除すると疑問符が表示されます)。

EDIT:ヘルプボタンでクリック検出が追加されました。これは、HwndSource.AddHookを使用してWndProcにフックし、SC_CONTEXTHELPのwParamを使用して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

これはもう1つの質問です:どのように "?"にOnClickハンドラを追加しますか?ボタン? – Carlo

+0

ヘルプボタンのクリックを検出するためのコードを追加しました。これが役に立ちますようにお願いします。 – Nir

+0

チャームのように働きました。ありがとう! – Carlo

0

WPFでヘルプボタンが表示されません。しかし、自分自身をロールバックするべきではありません。

+0

タイトルバーには? Windowsクロムを変更する必要があるようですが、これは文書化されていますが、簡単なものではありません。 – micahtan

+0

ベストプラクティスでもありません。代わりに、自分のタイトルバーをモックアップするWPFアプリも、理想的ではありません。 –

+0

@Drew:ええ、それは私がこれまで見た唯一の解決策であり、それは私にはあまり良くないようです。特に、すでにたくさんのダイアログボックスがあり、タイトルバーをモックアップするのは良いことではないでしょう。 – Carlo

0

クライアント以外の領域にボタンを追加する場合は、this articleをご覧ください。