2009-09-23 36 views
17

Tôi muốn đạt được hiệu ứng tương tự như Windows Media Player hoặc Trình duyệt Flash dựa trên đó chiếm TOÀN BỘ (thậm chí không có thanh tác vụ có thể nhìn thấy) bất động sản khi tối đa.WPF Window with Style = Không bao gồm thanh tác vụ khi tối đa hóa sau khi khởi tạo ứng dụng

Tính năng này hoạt động tốt nếu WindowState được đặt thành MaximizedWindowStyle được đặt thành None trong XAML để ứng dụng được bắt đầu ở trạng thái đó. Vấn đề là tôi muốn khởi động ứng dụng trong một cửa sổ có viền và khi người dùng chọn, tối đa hóa như được chỉ định ở trên. Trong trình xử lý StateChanged tôi kiểm tra trạng thái Maximized và nếu đây là trường hợp tôi đặt WindowStyle thành None. Điều này có tác dụng tối đa hóa cửa sổ nhưng KHÔNG bao gồm thanh tác vụ. Các mã sau đây sẽ làm cho công việc này như tôi muốn nhưng một hack của nó và tôi muốn để làm sạch nó lên:

if (WindowState == WindowState.Maximized) 
{ 
    m_videoWindow.Maximize(); 

    WindowStyle = WindowStyle.None; 

    //the following makes this work but I would like to clean it up 
    Hide(); 
    Show(); 
} 

EDITThis (từ năm 2006 khi vẫn còn trong CTP) đề cập đến vấn đề này và một người nào đó từ MS nói rằng họ hy vọng sẽ cải thiện hỗ trợ toàn màn hình trong phiên bản tiếp theo, có những cải tiến này được thực hiện?

+0

Vấn đề này vẫn còn sống và tốt với tất cả các phiên bản mới nhất của WPF/.NET 4.0 ... - Tôi đoán Microsoft muốn lỗi này tương thích ngược ... ẩn/hiển thị sửa lỗi của bạn hoạt động tốt mặc dù ... Tôi đang làm một chút khác biệt, gọi Hide, thiết lập các thuộc tính, sau đó gọi Show. – BrainSlugs83

+0

Thật đáng tiếc. Tôi nhận thấy một số điều khiển của tôi không được thay đổi kích cỡ đúng cách, không có ý tưởng tại sao (hoặc với đơn đặt hàng của tôi, hoặc với đơn đặt hàng của bạn ...); Giải pháp nhanh là Maximize, gọi DoEvents(), đặt WindowStyle thành None, sau đó gọi Hide & Show. - DoEvents là tất nhiên System.Windows.Forms.Application.DoEvents() (Vâng, tôi biết đó là điên rồ, và có lẽ là thực hành tồi tệ nhất, nhưng nó hoạt động ...) – BrainSlugs83

Trả lời

13

Bài viết này giải thích tất cả: Maximizing window (with WindowStyle=None) considering Taskbar.

Ngoài ra, hãy kiểm tra: Custom Window Chrome in WPF.

Sửa: Bây giờ mới là Thư viện Tích hợp Shell WPF cho phép Restyle hoàn chỉnh của chrome cửa sổ mà không có sự đau đầu của reimplementing di chuyển, thay đổi kích thước, vv

Sửa 2015: Thư viện Tích hợp Shell tại là tích hợp trong WPF và MS đã gỡ bỏ mã số

+0

Cảm ơn Eduardo. Tôi đã đọc nhưng đã hy vọng có một giải pháp mà không yêu cầu Win32. Tôi chắc chắn rằng phải có một cái gì đó, như là hack mà tôi đề cập ở trên các công trình .... –

+0

Tôi đoán không có, bởi vì hành vi là do thiết kế, vì vậy bạn có thể có một cửa sổ mà có tất cả các máy tính để bàn, như BabySmash. –

+1

Không lạ gì khi khi tải cửa sổ ban đầu với WindowStyle = None và WindowState = Tối đa hóa thanh tác vụ bị che khuất nhưng khi tối đa hóa cửa sổ sau khi được tải thì đây không phải là trường hợp? –

1

Tôi không biết điều này có phù hợp với bạn không, nhưng bạn có thể thay đổi kích thước cửa sổ để có cùng kích thước so với khu vực làm việc (có nghĩa là, trong hầu hết các trường hợp, tất cả màn hình ngoại trừ thanh tác vụ) và định vị nó ở 0,0 (góc trên cùng bên trái):

Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width; 
Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height; 
Left = 0; 
Top = 0; 

Định nghĩa chính xác cho các tài sản (từ MSDN) WorkingArea là:

Gets khu vực làm việc của màn hình. Khu vực làm việc là khu vực màn hình của màn hình, không bao gồm thanh tác vụ, cửa sổ được gắn và thanh công cụ được gắn đế.

Hy vọng nó giúp

+0

Điều gì sẽ xảy ra nếu thanh tác vụ ở trên đầu? Hoặc bạn có nhiều màn hình? –

+0

Trong trường hợp đó, điều này sẽ không hoạt động như mong đợi. – Fix

+0

Vâng, tôi đã có cùng một ý tưởng, nhưng cũng bị phản đối như vậy. Thật đáng tiếc là nó không đơn giản để truy vấn mà theo dõi ứng dụng được bật, và có được chính xác RECT cho màn hình đó ... có lẽ một số cuộc gọi interop để làm điều đó, nhưng ... – BrainSlugs83

2

Để có được điều này để hoạt động đúng trong ứng dụng WPF/.NET 4.0, tôi đang gọi chức năng này bất cứ khi nào tôi nhập cảnh, xuất cảnh đầy đủ chế độ màn hình:

private static void RefreshWindowVisibility(Window window) 
     { 
      if (window.OriginalWindowState == WindowState.Maximized) 
      { 
       window.Hide(); 
       window.Show(); 
       window.BringIntoView(); 
      } 
     } 

Có một nhấp nháy được kết hợp với phương pháp này, nhưng có vẻ như cùng một nhấp nháy tồn tại khi chuyển sang chế độ toàn màn hình trên Chrome. Internet Explorer dường như có cách tiếp cận khác.

2

Tôi thấy tôi có thể tối đa hóa toàn màn hình (bao gồm thanh tác vụ) bằng cách đặt thuộc tính khi tạo cửa sổ (trong xaml), nhưng không thể chuyển đổi qua lại sau khi tạo. Sau một số thử nghiệm, tôi thấy thứ tự các thuộc tính được thiết lập dường như quan trọng:

public bool IsFullscreen 
{ 
    get 
    { 
     return WindowState == System.Windows.WindowState.Maximized 
      && ResizeMode == System.Windows.ResizeMode.NoResize 
      && WindowStyle== System.Windows.WindowStyle.None; 
    } 
    set 
    { 
     if (value) 
     { 
      ResizeMode = System.Windows.ResizeMode.NoResize; 
      WindowStyle = System.Windows.WindowStyle.None; 
      WindowState = System.Windows.WindowState.Maximized; 
     } 
     else 
     { 
      ResizeMode = System.Windows.ResizeMode.CanResize; 
      WindowStyle = System.Windows.WindowStyle.SingleBorderWindow; 
      WindowState = System.Windows.WindowState.Normal;    
     } 
    } 
} 

Lưu ý rằng windowState đến cuối trong setter.

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