2008-12-04 28 views
66

WPF không cung cấp khả năng có cửa sổ cho phép thay đổi kích thước nhưng không tối đa hóa hoặc thu nhỏ các nút. Tôi muốn có thể tạo một cửa sổ như vậy để tôi có thể có các hộp thoại có thể thay đổi kích cỡ.Làm thế nào để loại bỏ tối thiểu và tối đa hóa từ một cửa sổ thay đổi kích thước trong WPF?

Tôi biết giải pháp sẽ có nghĩa là sử dụng pinvoke nhưng tôi không chắc chắn nên gọi và cách thực hiện. Một tìm kiếm của pinvoke.net đã không bật lên bất cứ điều gì nhảy ra khỏi tôi như những gì tôi cần, chủ yếu là tôi chắc chắn vì Windows Forms cung cấp các thuộc tính CanMinimizeCanMaximize trên các cửa sổ của nó.

Ai đó có thể chỉ cho tôi hướng tới hoặc cung cấp mã (C# được ưu tiên) về cách thực hiện việc này?

Trả lời

93

tôi đã bị đánh cắp một số mã tôi tìm thấy trên các diễn đàn MSDN và đưa ra một phương pháp khuyến nông trên lớp Window, như thế này:

internal static class WindowExtensions 
{ 
    // from winuser.h 
    private const int GWL_STYLE  = -16, 
         WS_MAXIMIZEBOX = 0x10000, 
         WS_MINIMIZEBOX = 0x20000; 

    [DllImport("user32.dll")] 
    extern private static int GetWindowLong(IntPtr hwnd, int index); 

    [DllImport("user32.dll")] 
    extern private static int SetWindowLong(IntPtr hwnd, int index, int value); 

    internal static void HideMinimizeAndMaximizeButtons(this Window window) 
    { 
     IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle; 
     var currentStyle = GetWindowLong(hwnd, GWL_STYLE); 

     SetWindowLong(hwnd, GWL_STYLE, (currentStyle & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX)); 
    } 
} 

Chỉ có điều khác cần nhớ là đối với một số lý do này doesn' t làm việc từ một hàm tạo của cửa sổ. Tôi nhận được xung quanh đó bằng cách chucking điều này vào constructor:

this.SourceInitialized += (x, y) => 
{ 
    this.HideMinimizeAndMaximizeButtons(); 
}; 

Hy vọng điều này sẽ giúp!

+0

Thật vậy! Cảm ơn nhiều! – Nidonocu

+0

Có lẽ nó sẽ có ý nghĩa hơn để làm điều này sau khi xử lý đã được tạo ra, có lẽ trong một xử lý cho sự kiện khởi tạo trên cửa sổ? –

+0

Giải pháp thay thế tốt Mike. Hoạt động hoàn hảo. – BrettRobi

17

Không biết nếu điều này làm việc cho req của bạn. trực quan .. Đây là

<Window x:Class="DataBinding.MyWindow" ...Title="MyWindow" Height="300" Width="300" 
    WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip"> 
+1

Điều này hầu như hoạt động, nhưng vẫn có thể tối đa hóa hoặc thu nhỏ cửa sổ nếu bạn nhấp đúp vào thanh tiêu đề, nhấp chuột phải và sử dụng trình đơn điều khiển hoặc nút thanh tác vụ nếu nó là có sẵn. Thêm vào đó tất nhiên nó trông giống như một cửa sổ công cụ, không phải là một cửa sổ bình thường. – Nidonocu

+0

Phải ... nhưng sau đó một lần nữa IMHO ràng buộc có vẻ kỳ quặc mà người dùng không được phép tối đa hóa nhưng có thể kéo-mở rộng cửa sổ bằng tay bằng cách thay đổi kích thước. Nhưng đó là cửa sổ của bạn .. quy tắc của bạn :) – Gishu

+0

điều này có thể hữu ích cho các tình huống mà 'MaxWidth' và/hoặc' MaxHeight' của cửa sổ đã được thiết lập. –

2

Bạn có thể đặt ResizeMode = "noresize" của cửa sổ nếu bạn muốn loại bỏ minimize và maximize nút

+0

Ehh nhưng sau đó bạn không thể thay đổi kích thước nó sẽ có thể – Karsten

3

Dưới đây là một giải pháp tôi đang sử dụng. Lưu ý rằng nút phóng to vẫn được hiển thị.

Markup:

<Window x:Class="Example" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Example" 
     StateChanged="Window_StateChanged"> 

Mã đằng sau:

// Disable maximizing this window 
private void Window_StateChanged(object sender, EventArgs e) 
{ 
    if (this.WindowState == WindowState.Maximized) 
     this.WindowState = WindowState.Normal; 
} 
+1

Ông hỏi làm thế nào để ẩn các nút nhưng giữ chức năng. – alexandrudicu

+0

Tối thiểu như thế này, cửa sổ nhấp nháy. Không tốt lắm. – Mugen

73

Một cách là để thiết lập ResizeMode="NoResize" của bạn. Nó sẽ cư xử như thế này. enter image description here

Tôi hy vọng điều này sẽ hữu ích!

+0

Giúp tôi, cảm ơn bạn! –

+22

Điều này sẽ làm cho cửa sổ không thể thay đổi kích thước, điều này trái ngược trực tiếp với câu hỏi. – Mashmagar

+3

Nói chung, các nhà quảng cáo tìm kiếm cách vô hiệu hóa tối thiểu và tối đa hóa các nút không có yêu cầu cụ thể để có thể thay đổi kích thước cửa sổ. Hiện tại đây là kết quả hàng đầu cho truy vấn "wpf window disable minimimize" và câu trả lời này trả lời chính xác câu hỏi. Bất kể, xấu hổ rằng MS đã không làm thanh tiêu đề hoặc toàn bộ cửa sổ chrome là "chỉ là một điều khiển hoặc tài sản". Quá nhiều di sản từ '90 ... –

3

Nếu có ai sử dụng cửa sổ Devexpress (DXWindow) chấp nhận câu trả lời không hoạt động. Một cách tiếp cận xấu xí là

public partial class MyAwesomeWindow : DXWindow 
{ 
    public MyAwesomeWIndow() 
    { 
     Loaded += OnLoaded; 
    } 

    private void OnLoaded(object sender, RoutedEventArgs routedEventArgs) 
    { 
     // hides maximize button    
     Button button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_Maximize.ToString()); 
     button.IsHitTestVisible = false; 
     button.Opacity = 0; 

     // hides minimize button 
     button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_Minimize.ToString()); 
     button.IsHitTestVisible = false; 
     button.Opacity = 0; 

     // hides close button 
     button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_CloseButton.ToString()); 
     button.IsHitTestVisible = false; 
     button.Opacity = 0; 
    } 
} 
+0

Tôi có thể đọc năm bài viết khác nhau trước khi tôi nhận thấy câu trả lời của bạn ở đây. Điều này không hoạt động, nhưng yuck. Bạn đã bao giờ tìm thấy một cách tốt hơn? – DonBoitnott

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