Прозрачное окно 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();
}
скриншот ниже:
сначала я бы посмотрел на настройку(a)lpha в цвете rgb (a) цвета фона. Параметр alpha задает непрозрачность цвета объекта.
хотя, я замечаю, что, когда я публикую это, есть еще один пост перед моим, который выглядит более кратким и, вероятно, будет более подходящим для вас.