2013-07-31 39 views
11

Tôi muốn biết cách vô hiệu hóa (không xóa/ẩn) nút Đóng trong cửa sổ WPF. Tôi biết làm thế nào để ẩn nó mà làm cho cái nhìn của cửa sổ thanh tiêu đề như thế này:Vô hiệu hoá nút đóng trong thanh tiêu đề của cửa sổ WPF (C#)

enter image description here

Nhưng tôi muốn vô hiệu hóa nó có nghĩa là nó sẽ giống như thế này:

enter image description here

Tôi kịch bản trong C# và sử dụng WPF (Windows Presentation Foundation).

+0

Tôi tìm thấy liên kết này Xem nếu điều này [link] [1] có thể giúp: [1]: http://stackoverflow.com/questions/743906/how-to-hide-close-button-i n-wpf-window – Vishal

Trả lời

16

Hãy thử điều này:

public partial class MainWindow : Window 
{ 

    [DllImport("user32.dll")] 
    static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); 
    [DllImport("user32.dll")] 
    static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable); 



    const uint MF_BYCOMMAND = 0x00000000; 
    const uint MF_GRAYED = 0x00000001; 
    const uint MF_ENABLED = 0x00000000; 

    const uint SC_CLOSE = 0xF060; 

    const int WM_SHOWWINDOW = 0x00000018; 
    const int WM_CLOSE = 0x10; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 

    protected override void OnSourceInitialized(EventArgs e) 
    { 
     base.OnSourceInitialized(e); 

     HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource; 

     if (hwndSource != null) 
     { 
      hwndSource.AddHook(new HwndSourceHook(this.hwndSourceHook)); 
     } 
    } 


    IntPtr hwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
    { 
     if (msg == WM_SHOWWINDOW) 
     { 
      IntPtr hMenu = GetSystemMenu(hwnd, false); 
      if (hMenu != IntPtr.Zero) 
      { 
       EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); 
      } 
     } 
     else if (msg == WM_CLOSE) 
     { 
      handled = true; 
     } 
     return IntPtr.Zero; 
    } 
} 

(Taken từ đây: http://blogs.microsoft.co.il/blogs/tamir/archive/2007/09/26/never-ever-close-me-how-to-disable-close-button-in-wpf.aspx)

chắc chắn rằng bạn thiết lập các ResizeMode-NoResize.

+1

Tôi đề nghị rằng 'else if (msg == WM_CLOSE) { xử lý = true; }' bị bỏ qua vì điều này sẽ ngăn cửa sổ đóng lại theo chương trình. – Hans

3

Bạn cần phải ghi đè lên và trong OnCLosing kiện thiết e.cancel = true

public MyWindow() 
{ 
    InitializeComponent(); 
    this.Closing += new System.ComponentModel.CancelEventHandler(MyWindow_Closing); 
} 

void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    e.Cancel = true; 
} 
+2

Điều này không làm cho nút trông giống như nó bị tắt. –

+0

Có, nhưng tôi muốn thực sự vô hiệu hóa nút Đóng thay vì làm cho nó hủy đóng. – Bubbled86

+0

Tôi e rằng bạn chỉ có thể ẩn hoặc ghi đè trong WPF, hãy xem http://stackoverflow.com/questions/743906/how-to-hide-close-button-in-wpf-window – Rohit

1

Bạn có lẽ có thể làm điều đó với win32 hackery.

Tôi đã thực hiện theo cách này: Nhận CustomChromeWindow (cuối cùng sẽ trông giống như hình ảnh), và chỉ cần liên kết Command() bất động sản để xemmodel, và sau đó đặt CanExecuteCommand = false, mà sẽ làm cho nút bị vô hiệu hóa (How does one "disable" a button in WPF using the MVVM pattern?).

Có thể tôi theo cách này quá: How to disable close button on a window in another process with C++?

Về cơ bản, gọi đó là mã với PInvoke. Bạn có thể dễ dàng xử lý cửa sổ WPF.

1

This post mà một câu trả lời bằng Behavior, GetWindowLongSetWindowLong:

public class HideCloseButtonOnWindow : System.Windows.Interactivity.Behavior<Window> 
{ 
    #region bunch of native methods 

    private const int GWL_STYLE = -16; 
    private const int WS_SYSMENU = 0x80000; 

    [DllImport("user32.dll", SetLastError = true)] 
    private static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

    [DllImport("user32.dll")] 
    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 

    #endregion 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.Loaded += OnLoaded; 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.Loaded -= OnLoaded; 
     base.OnDetaching(); 
    } 

    private void OnLoaded(object sender, RoutedEventArgs e) 
    { 
     var hwnd = new System.Windows.Interop.WindowInteropHelper(AssociatedObject).Handle; 
     SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU); 
    } 
} 

Làm thế nào để sử dụng nó:

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:w="clr-namespace:WpfApplication2"> 

<i:Interaction.Behaviors> 
    <w:HideCloseButtonOnWindow /> 
</i:Interaction.Behaviors> 

</Window> 
Các vấn đề liên quan