2011-02-08 57 views
9

Tôi về cơ bản muốn có cửa sổ WPF của tôi ở chế độ toàn màn hình, khi nhấn F11 hoặc nút phóng to ở góc trên cùng bên phải của cửa sổ được nhấn.WPF toàn màn hình tối đa hóa

Trong khi các công việc sau như một nét duyên dáng cho cách nhấn F11:

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.F11) 
    { 
     WindowStyle = WindowStyle.None; 
     WindowState = WindowState.Maximized; 
     ResizeMode = ResizeMode.NoResize; 
    } 
} 

này sẽ vẫn hiển thị trên thanh tác vụ của Windows (thử nghiệm với Windows 7):

protected override void OnStateChanged(EventArgs e) 
{ 
    if (WindowState == WindowState.Maximized) 
    { 
     WindowStyle = WindowStyle.None; 
     WindowState = WindowState.Maximized; 
     ResizeMode = ResizeMode.NoResize; 
    } 
    base.OnStateChanged(e); 
} 

tôi thiếu gì ở đây? Hay tôi có thể làm nó thanh lịch hơn nữa?

Trả lời

18

WPF dường như đang đưa ra quyết định abo ut có nên đi toàn màn hình hoặc tôn trọng thanh tác vụ dựa trên WindowStyle tại thời điểm tối đa hóa hay không. Vì vậy, một giải pháp kludgy nhưng hiệu quả là để chuyển đổi các cửa sổ trở lại phi tối đa, thiết lập WindowStyle, và sau đó thiết lập các cửa sổ lại để tối đa một lần nữa:

private bool _inStateChange; 

protected override void OnStateChanged(EventArgs e) 
{ 
    if (WindowState == WindowState.Maximized && !_inStateChange) 
    { 
    _inStateChange = true; 
    WindowState = WindowState.Normal; 
    WindowStyle = WindowStyle.None; 
    WindowState = WindowState.Maximized; 
    ResizeMode = ResizeMode.NoResize; 
    _inStateChange = false; 
    } 
    base.OnStateChanged(e); 
} 

Mặc dù mã nguồn rõ ràng là xấu xí, việc chuyển đổi sang bình thường và sau đó trở lại Maximized dường như không làm cho người dùng kinh nghiệm tồi tệ hơn. Trên màn hình hiển thị của tôi, tôi nhận thấy nhấp nháy với cả mã F11 và kludge tối đa hóa, nhưng không đáng kể tồi tệ hơn trên kludge tối đa hóa. Nhưng số dặm của bạn có thể thay đổi!

+5

* knock knock * - Ai đó? - Một semaphore từ '70. Một trong những tốt đẹp mặc dù, nó hoạt động. +1 –

+0

Cái này hoạt động tốt. Thậm chí nó xấu xí, nó cảm thấy tốt hơn sau đó thực hiện 'WindowInteropHelper' hoặc một số dll nhập khẩu cho một cái gì đó cơ bản như toàn màn hình. Tôi phải suy nghĩ về nó, thường là ý tưởng hay! –

+1

Trong thực tế điều này tạo ra một hiệu ứng có thể nhìn thấy xấu xí trong Window XP, bởi vì cả hai thay đổi WindowState có một biểu diễn trực quan trong Windows XP, một thanh tiêu đề màu xanh đi lên và xuống, tạo ra một cửa sổ hấp dẫn với kỹ thuật này. – cprcrack

3

Bạn cần đặt Window.Topmost property.

Sửa

Kiểm tra bài viết trên blog này Maximizing window (with WindowStyle=None) considering Taskbar

+0

Tôi đã cố gắng 'Topmost = true;' và nó sẽ không thay đổi hành vi. –

+0

Thanh tác vụ của bạn có được đặt thành "tối đa nhất" không? Nó hoạt động ở đây. –

+0

Câu hỏi ngu ngốc. Làm thế nào tôi có thể kiểm tra xem thanh tác vụ của tôi có được đặt thành "tối đa nhất" hay không. Như tôi đã nói, nó hoạt động tốt (có và không có 'Topmost') nhấn F11. –

0

Bạn có thể ẩn thanh tác vụ nếu bạn nhập user32.dll ...

[DllImport("user32.dll")] 
private static extern int FindWindow(string className, string windowText); 
[DllImport("user32.dll")] 
private static extern int ShowWindow(int hwnd, int command); 

private const int SW_HIDE = 0; 
private const int SW_SHOW = 1; 

Cách sử dụng:

int hwnd = FindWindow("Shell_TrayWnd",""); 
ShowWindow(hwnd,SW_HIDE); 
+5

Bạn vừa phá hủy thanh tác vụ của mình! –

+0

Bạn phải gọi ShowWindow (hwnd, SW_SHOW) khi thoát toàn màn hình ... –

+0

Cảm ơn kzen! Nhưng dù sao, điều này đã giảm không WPF như tôi. Nhưng nó có thể là một lựa chọn. –

0

Tôi đã tìm thấy cách dễ dàng để đạt được độ toàn màn hình trong WPF:

private double LastHeight, LastWidth; 
    private System.Windows.WindowState LastState; 

    private void Window_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.F11) 
     { 
      if (WindowStyle != WindowStyle.None) 
      { 
       LastHeight = Height; 
       LastWidth = Width; 
       LastState = WindowState; 

       Topmost = true; 
       Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width; 
       Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height; 
       Top = 0; 
       Left = 0; 
       WindowState = System.Windows.WindowState.Normal; 
       WindowStyle = WindowStyle.None; 
       ResizeMode = System.Windows.ResizeMode.NoResize; 
      } 
      else 
      { 
       WindowStyle = WindowStyle.SingleBorderWindow; 
       WindowState = LastState; ; 
       ResizeMode = ResizeMode.CanResizeWithGrip; 
       Topmost = false; 
       Width = LastWidth; 
       Height = LastHeight; 
      } 
     } 
    } 

này hoạt động tốt trong Windows 7 với Taskbar cố định.

+0

Cách này không hoạt động khi bạn đang chạy chương trình trên máy màn hình kép vì chương trình luôn được tối đa hóa trên màn hình bên trái. –

3

Một giải pháp mà làm việc cho tôi:

Bạn có thể thiết lập thuộc tính của cửa sổ đó MaxHeight để SystemParameters.MaximizedPrimaryScreenHeight sử dụng các nhà xây dựng.

public MainWindow() 
{ 
    InitializeComponent(); 
    this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight; 
} 

Cảnh báo: Điều này có thể không hoạt động trên máy tính để bàn mở rộng.

Nguồn:Maximize window with WindowState Problem (application will hide windows taskbar)

2

thử này

Topmost="True" and WindowState="Maximized" 

bạn có thể nhìn thấy cửa sổ của bạn sẽ bao gồm tất cả các màn hình và ẩn tất cả các cửa sổ trên thanh tác vụ

+0

Làm việc tốt hơn bất kỳ người nào khác trên Windows 10! (Cập nhật kỷ niệm) –

1

Nếu vẫn còn ai đó mà cần một mịn toàn màn hình tất nhiên chỉ được kiểm tra trên cửa sổ 10! Trong cửa sổ 10 giảm thiểu làm ít nhấp nháy nếu bạn duy trì thứ tự mã này!

public bool IsFullscreen = false; 
    public WindowState lastWindowState; 
    private void player_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     if (IsFullscreen) 
     { 
      this.WindowStyle = WindowStyle.SingleBorderWindow; 
      this.WindowState = lastWindowState; 
      IsFullscreen = false; 

     } 
     else 
     { 
      lastWindowState = this.WindowState; 

      this.WindowStyle = WindowStyle.None; 
      if (this.WindowState == WindowState.Maximized) 
       this.WindowState = WindowState.Minimized; 
      this.WindowState = WindowState.Maximized; 
      IsFullscreen = true; 
     } 
    } 
+0

Cảm ơn, cũng hoạt động tốt trên Windows XP và Windows 7. – dbostream

+0

Một vấn đề với câu trả lời này là nó sử dụng sự kiện MouseDoubleClick trong khi câu hỏi hỏi làm thế nào để thay đổi hành vi của nút Phóng to. Trong khi điều này sẽ làm việc, nó sẽ là tốt hơn nếu sự kiện được sử dụng trong ví dụ này thay đổi để nó sẽ giải quyết các câu hỏi. –

1

Nếu bạn tình cờ được sử dụng WindowChrome để tạo ra một trải nghiệm riêng chrome, bạn sẽ cần phải thiết lập các GlassFrameThickness một cái gì đó khác hơn 0 (ít nhất đó là điều cuối cùng tôi cần phải làm gì để có được sự thanh tác vụ được ẩn đằng sau cửa sổ). Đó là ngoài các bước được cung cấp trong câu trả lời được chấp nhận.

0

Trong trường hợp của tôi, việc thu nhỏ và phóng to sẽ làm cho kích thước toàn màn hình lớn hơn một chút so với màn hình, do đó, thay thế tôi thấy là tạm thời đặt Chế độ hiển thị thành Đã thu gọn rồi quay lại Hiển thị sau đó để buộc vẽ lại.

Visibility = Visibility.Collapsed; 
WindowStyle = WindowStyle.None; 
WindowState = WindowState.Maximized; 
ResizeMode = ResizeMode.NoResize; 
Visibility = Visibility.Visible; 
Các vấn đề liên quan