2013-06-04 132 views
8

Tôi muốn tạo một ứng dụng đơn giản, trong suốt nhưng vẫn giữ được đường viền 'bình thường', nút đóng, thu nhỏ và tối đa hóa nút.Cửa sổ trong suốt WPF C# với đường viền

tôi biết làm thế nào để làm cho cửa sổ trong suốt bằng cách sử dụng tiêu chuẩn

<Window 
    WindowStyle="None" 
    AllowsTransparency="True" 
    Background="Transparent"> 
</Window> 

nhưng này loại bỏ các nút phía trên bên phải biên giới và. Tôi đọc bài viết này,

Transparent window with a border

mà loại cho giải pháp, nhưng thực sự, tôi chỉ muốn có thể để giữ cho đường biên giới tiêu chuẩn mà sẽ có mặt ở đó nếu tôi không làm cho các cửa sổ trong suốt. Các phương tiện tôi có thể di chuyển cửa sổ, thay đổi kích thước, đóng, vv ... Điều này có thể?

Trả lời

6

Tôi ném cùng một lớp transparancy Chuyển đổi nhanh chóng based on this tutorial on Microsoft.com bạn có thể sử dụng cho mục đích này:

using System; 
using System.Runtime.InteropServices; 
using System.Windows; 
using System.Windows.Interop; 

namespace WpfApplication2 
{ 
    class TransparancyConverter 
    { 
     private readonly Window _window; 

     public TransparancyConverter(Window window) 
     { 
      _window = window; 
     } 

     public void MakeTransparent() 
     { 
      var mainWindowPtr = new WindowInteropHelper(_window).Handle; 
      var mainWindowSrc = HwndSource.FromHwnd(mainWindowPtr); 
      if (mainWindowSrc != null) 
       if (mainWindowSrc.CompositionTarget != null) 
        mainWindowSrc.CompositionTarget.BackgroundColor = System.Windows.Media.Color.FromArgb(0, 0, 0, 0); 

      var margins = new Margins 
      { 
       cxLeftWidth = 0, 
       cxRightWidth = Convert.ToInt32(_window.Width) * Convert.ToInt32(_window.Width), 
       cyTopHeight = 0, 
       cyBottomHeight = Convert.ToInt32(_window.Height) * Convert.ToInt32(_window.Height) 
      }; 

      if (mainWindowSrc != null) DwmExtendFrameIntoClientArea(mainWindowSrc.Handle, ref margins); 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     public struct Margins 
     { 
      public int cxLeftWidth; 
      public int cxRightWidth; 
      public int cyTopHeight; 
      public int cyBottomHeight; 
     } 

     [DllImport("DwmApi.dll")] 
     public static extern int DwmExtendFrameIntoClientArea(IntPtr hwnd, ref Margins pMarInset); 
    } 
} 

Khi bạn có điều này trong, thêm thuộc tính nền trong suốt để XAML của bạn và đăng ký các sự kiện Window_Loaded và gọi phương pháp MakeTransparent:

<Window etc etc Background="Transparent" Loaded="Window_Loaded"> 

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    var transparancyConverter = new TransparancyConverter(this); 
    transparancyConverter.MakeTransparent(); 
} 

Một ảnh chụp màn hình dưới:

Screenshot

+0

Cảm ơn rất nhiều Tôi sẽ chơi xung quanh với nó –

+0

Hầu hết các hoạt động. Có vẻ như nó hoạt động trong cửa sổ 7 nhưng không có trong cửa sổ 8. Bất kỳ đề xuất nào? Cảm ơn bạn trước! –

+0

@StefanVasiljevic Đừng nghĩ rằng bạn sẽ có nhiều may mắn trên 8, mã trên sử dụng Aero mà không tồn tại trên Windows 8 đáng buồn là – JMK

1

Lần đầu tiên tôi sẽ xem (a) thiết lập lpha trong màu rgb (a) của màu nền. Cài đặt alpha đặt độ mờ của màu đối tượng.

Mặc dù, tôi nhận thấy rằng khi tôi đăng bài này, có một bài đăng khác trước tôi có vẻ ngắn gọn hơn và có thể phù hợp hơn với bạn.

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