2009-06-17 35 views
16

Bu düğmeyi WPF'deki başlık çubuğuna nasıl ekleyebilirim, çok fazla uygulamada kullanıldığından, bunun bir şey yapılacağını düşündüm, ama öyle değil gibi görünüyor. Bu konuda bir şey biliyorsanız, lütfen bana bildirin.Yardım "?" düğme

Teşekkürler.

Düzenleme:

this eşdeğer bir şey yok?

Temelde

, var mı?

public Form1() 
{ 
    InitializeComponent(); 

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

WPF böyle bir şey yok mu: kazan formlarda simgesi, yapmanız gereken tek şey bu mu?

+0

Neden başlık çubuğu? Gördüğüm çoğu uygulama bunu menü çubuğuna koydu. –

+1

Şey, çoğunlukla, genellikle bir menü çubuğu olmayan iletişim pencerelerinde kullanacağız. Tıklandığında bu pencere için bağlamsal yardım getirecektir. Yazı tipi iletişim penceresinde MS Word 2007 gibi bir şey. – Carlo

cevap

30

Bu sadece Pencere sınıfa bu kod gömme, basit.

Bu kod, WS_MINIMIZEBOX ve WS_MAXIMIZEBOX stillerini kaldırmak ve WS_EX_CONTEXTHELP genişletilmiş stilini eklemek için birlikte çalışma kullanır (soru işareti yalnızca simge durumuna küçült ve düğmelerini kaldırırsanız gösterilir).

DÜZENLEME: yardım düğmesindeki tıklatma algılaması eklendi, bu işlem HwndSource.AddHook kullanarak WndProc içine takılarak ve wParam of SC_CONTEXTHELP ile bir WM_SYSCOMMAND mesajı dinleyerek yapılır. Bir tıklama bu kod, bir ileti kutusu göstermek bir olayın, yönlendirilmiş olay veya (MVVM uygulamalar için) bile komuta içine bu değişen olacaktır algılandığında

okuyucuya alıştırma olarak bırakılmıştır.

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

, bir soru daha var: "?" Için bir OnClick işleyicisi nasıl ekleyebilirim? buton? – Carlo

+0

Yardım düğmesindeki tıklamaları algılamak için kodu ekledim, umarım bu yardımcı olur – Nir

+0

Bir çekicilik gibi çalışır. Teşekkürler! – Carlo

0

Hiçbir yardım düğmeleri WPF ile kutudan geliyor. Ancak kendi başınızı döndürmek için bir itme olmamalıdır. Eğer müşteri olmayan alana düğme eklemek istiyorsanız

+0

Başlık çubuğuna mı? Belgelenen, ancak önemsiz olmayan Pencere kromunu değiştirmeniz gerektiği gibi görünüyor. – micahtan

+0

Ve en iyi uygulama da değil. Bunun yerine, kendi başlık çubuklarını uyandıran WPF uygulamalarını da ideal görmüyorum. –

+0

@Drew: Evet, şimdiye kadar gördüğüm tek çözüm bu ve bana göre pek iyi görünmüyor. Özellikle zaten çok fazla iletişim kutumuz var ve her birine gitmek ve başlık çubuğunu karıştırmak iyi olmaz. – Carlo