2009-06-17 36 views
16

Cách thêm nút này vào thanh tiêu đề trong WPF, bởi vì nó được sử dụng trong rất nhiều ứng dụng mà tôi nghĩ rằng nó sẽ được xây dựng trong hoặc một cái gì đó, nhưng có vẻ như nó không phải là. Dù sao cũng cho tôi biết nếu bạn biết gì về điều này.Trợ giúp "?" nút

Cảm ơn.

Chỉnh sửa:

Không có gì tương đương với this?

Về cơ bản, để có? biểu tượng trong biểu mẫu thắng, tất cả những gì bạn cần làm là:

public Form1() 
{ 
    InitializeComponent(); 

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

WPF không có gì giống như vậy?

+0

Tại sao thanh tiêu đề? Hầu hết các ứng dụng tôi thấy đặt nó trong thanh trình đơn. –

+1

Vấn đề là chúng ta sẽ sử dụng nó chủ yếu trên các cửa sổ hộp thoại, thường không có một thanh menu. Nhấp vào nó sẽ mang đến trợ giúp theo ngữ cảnh cho cửa sổ đó. Một cái gì đó giống như trong MS Word 2007 trong cửa sổ hộp thoại phông chữ. – Carlo

Trả lời

30

Thật đơn giản, chỉ cần chèn mã này vào lớp Cửa sổ của bạn.

Mã này sử dụng interop để xóa kiểu WS_MINIMIZEBOX và WS_MAXIMIZEBOX và thêm kiểu mở rộng WS_EX_CONTEXTHELP (dấu chấm hỏi sẽ chỉ hiển thị nếu bạn loại bỏ các nút thu nhỏ và tối đa).

EDIT: thêm phát hiện nhấp chuột vào nút trợ giúp, điều này được thực hiện bằng cách móc vào WndProc sử dụng HwndSource.AddHook và lắng nghe thông báo WM_SYSCOMMAND với wParam của SC_CONTEXTHELP.

Khi nhấp chuột được phát hiện, mã này sẽ hiển thị hộp thư, thay đổi điều này thành sự kiện, sự kiện được định tuyến hoặc thậm chí lệnh (đối với ứng dụng MVVM) được để lại dưới dạng bài tập cho người đọc.

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

công trình này, một câu hỏi nữa: Làm cách nào để thêm trình xử lý OnClick vào "?" nút? – Carlo

+0

Tôi đã thêm mã để phát hiện các nhấp chuột vào nút trợ giúp, hy vọng điều này sẽ giúp – Nir

+0

Làm việc giống như một sự quyến rũ. Cảm ơn! – Carlo

0

Không có nút trợ giúp nào thoát ra khỏi hộp với WPF. Tuy nhiên, không nên đẩy để cuộn của riêng bạn.

+0

Đến thanh tiêu đề? Có vẻ như bạn cần thay đổi Cửa sổ chrome, được ghi lại nhưng không tầm thường. – micahtan

+0

Và cũng không phải là cách thực hành tốt nhất. Thay vào đó, tôi thấy các ứng dụng WPF giả lập thanh tiêu đề của riêng mình, cũng không lý tưởng. –

+0

@Drew: Vâng, đó là giải pháp duy nhất tôi đã nhìn thấy cho đến nay và nó không có vẻ rất tốt với tôi. Đặc biệt bởi vì chúng tôi đã có tấn hộp thoại và nó sẽ không được tốt để đi đến mỗi và giả lập thanh tiêu đề. – Carlo

0

Nếu bạn định thêm nút vào khu vực không phải khách hàng, hãy xem this article.

Các vấn đề liên quan