2010-07-23 25 views
8

Tôi đang cố gắng tạo một cửa sổ WPF mở ra đã được phóng to, không có thay đổi kích cỡ/di chuyển (trong menu hệ thống, cũng như không biên giới). Nó phải được tối đa hóa mọi lúc, trừ khi người dùng thu nhỏ nó.Làm thế nào để? WPF Window - Phóng to, No Resize/Move

Tôi đã cố gắng đặt WindowState = "Maximized" và ResizeMode = "CanMinimize", nhưng khi cửa sổ mở ra, nó bao gồm thanh tác vụ (tôi không muốn nó).

Tôi có một móc để WndProc hủy bỏ SC_MOVE và SC_SIZE. Tôi cũng có thể thực hiện điều khiển này với các điều kiện trong WndProc như "nếu lệnh được khôi phục và được thu nhỏ, khôi phục, khác, chặn", v.v.

Nhưng quan điểm của tôi là nếu chúng ta có cách khác để thực hiện nó. Thankz for read guys =)

+0

Đây là sự cố thường gặp trong tất cả các khung ứng dụng Windows. Các khung ứng dụng rất tuyệt, chúng cho phép chúng tôi viết các ứng dụng rất nhanh chóng. Vấn đề là chúng không thể bao quát mọi kịch bản có thể và vì mục đích của chúng là che giấu các chi tiết nitty, gritty của hệ thống bên dưới, khi chúng ta thấy chúng ta cần phải có hành vi không chuẩn, chúng ta phải đào sâu và viết mã "xấu xí". – Tergiver

+0

Bạn muốn một cửa sổ chỉ có thể được phóng to hoặc thu nhỏ mà không có trạng thái bình thường có thể thay đổi kích thước/di chuyển? nhưng chưa được toàn màn hình? –

+0

@ John Gardner, Chính xác là tôi muốn. –

Trả lời

1

Như Tergiver đã chỉ ra, điều này là không thể theo cách hoàn toàn WPF. Bạn phải sử dụng P/Invoke. Đối với lý do tại sao cửa sổ bao gồm thanh tác vụ khi nó mở ra, tôi nghĩ rằng bạn đang messing lên một số yêu cầu cuộc gọi bằng cách hủy bỏ SC_MOVE và SC_SIZE. Có thể bạn nên hủy các cuộc gọi đó sau khi cửa sổ đã được tải.

+0

PInvoke ????? Làm thế nào về điều này trong constructor cửa sổ? // Ngăn cửa sổ chồng chéo thanh tác vụ this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight; this.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth; – Califf

2
public Window1() 
    { 
     InitializeComponent(); 

      this.SourceInitialized += Window1_SourceInitialized; 
    } 

    private void Window1_SourceInitialized(object sender, EventArgs e) 
    { 
     WindowInteropHelper helper = new WindowInteropHelper(this); 
     HwndSource source = HwndSource.FromHwnd(helper.Handle); 
     source.AddHook(WndProc); 
    } 

    const int WM_SYSCOMMAND = 0x0112; 
    const int SC_MOVE = 0xF010; 

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
    { 

     switch (msg) 
     { 
      case WM_SYSCOMMAND: 
       int command = wParam.ToInt32() & 0xfff0; 
       if (command == SC_MOVE) 
       { 
        handled = true; 
       } 
       break; 
      default: 
       break; 
     } 
     return IntPtr.Zero; 
    } 
+2

Mã này sẽ chỉ ngăn cửa sổ bị di chuyển hoặc phóng to. Nếu thay vào đó bạn sử dụng SC_SIZE nó cho phép cửa sổ được phóng to và thu nhỏ, nhưng không được thay đổi kích thước. const int SC_SIZE = 0xF000; Trong cửa sổ xaml của tôi, tôi sử dụng WindowState = "Minimized" và ResizeMode = "CanResize" –

12

Nó là cần thiết để viết WindowState="Maximized" ResizeMode="NoResize" trong XAML của cửa sổ của bạn:

<Window x:Class="Miscellaneous.EditForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Edit Form" WindowState="Maximized" ResizeMode="NoResize"></Window> 
+0

Đặt WindowState = "Maximized" không tương thích với tính năng SplashScreen (cửa sổ chính của bạn sẽ ẩn màn hình giật gân). Và nếu bạn không bắt đầu Tối đa hóa, thì ResizeMode = "NoResize" sẽ ngăn chặn tối đa hóa cửa sổ. –

0
WindowState="Maximized" 
ResizeMode="NoResize" 
WindowStyle="None" 

WindowStyle = "Không" làm những gì bạn muốn, nhưng ... bạn mất tiêu đề cửa sổ, gần và có các vấn đề khác.

Truy cập WindowStyle="None" some problems

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