Прозрачное окно C# WPF с границей

Я хотел бы сделать простое приложение, которое является прозрачным, но сохраняет "нормальные" границы, кнопку закрытия, минимизировать и максимизировать кнопку.

Я знаю, как сделать окно прозрачным, используя стандартный

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

но это удаляет границы и верхние правые кнопки. Я читаю эту нить,

прозрачное окно с границей

какой вид дает решение, но на самом деле я просто хочу иметь возможность сохранить стандарт границы, которые были бы там, если бы я не сделал окно прозрачным. Средства, которые я могу переместить окно, изменить размер, закрыть и т. д... Возможно ли это?

2 ответов


Я бросил вместе быстрый TransparencyConverter класс на основе этого учебника Microsoft.com Вы можете использовать для этой цели:

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

namespace WpfApplication2
{
    class TransparencyConverter
    {
        private readonly Window _window;

        public TransparencyConverter(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);
    }
}

после этого добавьте атрибут прозрачный фон в XAML и подпишитесь на событие Window_Loaded и вызовите метод MakeTransparent:

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

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

скриншот ниже:

Screenshot


сначала я бы посмотрел на настройку(a)lpha в цвете rgb (a) цвета фона. Параметр alpha задает непрозрачность цвета объекта.

хотя, я замечаю, что, когда я публикую это, есть еще один пост перед моим, который выглядит более кратким и, вероятно, будет более подходящим для вас.