По сути, вы хотите показать полноэкранное прозрачное окно верхнего уровня, которое не фокусируется и не реагирует на ввод.Затем вы можете использовать это окно, чтобы нарисовать оверлей вручную.Я думаю, что самым простым способом было бы переопределить OnRender для окна и нарисовать прямоугольник, который заполняет все окно, но использует обтравочную маску (через drawingContext.PushClip), чтобы исключить область, которую вы хотите оставить незакрытой.
РЕДАКТИРОВАТЬ:
Вот пример:
Вероятно, окно должно быть настроено следующим образом:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
AllowsTransparency="True"
WindowStyle="None"
WindowState="Maximized"
Topmost="False"
Background="{x:Null}"
IsHitTestVisible="False">
</Window>
Настройки WindowStyle
и WindowState
приведут кокно должно быть развернуто и перекрывать панель задач.Topmost
, установленный в значение true, приведет к тому, что окно будет поверх всех других окон, а IsHitTestVisible
приведет к тому, что щелчки мыши будут «проваливаться».
Предупреждение : если вы установитеэто застрянет в верхнем окне, которое вы не сможете закрыть, так как оно не слушает команды клавиатуры. Вам нужно будет вручную закрыть окно где-нибудь в вашем коде. Скорее всего, вы хотите создать глобальный хук мыши для прослушивания мыши вверх и хук клавиатуры для прослушивания ESC или чего-то еще.
Чтобы спасти людей от себя, я установил TopMost в False в приведенном выше примере.Измените его на true, только если вы выяснили, как / когда закрывать окно в коде где-либо.
Background
имеет значение null, чтобы вы могли использовать свой собственный рисунок в коде позади.
код, подобный следующему:
public MainWindow()
{
InitializeComponent();
}
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
var screenGeometry = new RectangleGeometry(new Rect(0, 0, ActualWidth, ActualHeight));
var excludeRectangle = new RectangleGeometry(new Rect(200, 200, 150, 150));
drawingContext.PushClip(CombinedGeometry.Combine(screenGeometry,excludeRectangle, GeometryCombineMode.Exclude,null));
drawingContext.PushOpacity(.8);
drawingContext.DrawRectangle(Brushes.Black, null, new Rect(0, 0, ActualWidth, ActualHeight));
drawingContext.Pop();
drawingContext.Pop();
}
, где вы будете использовать правильное расположение и размер для excludeRectangle.
Если вы запустите этот код, вы увидитеэкран затенен, за исключением небольшого прямоугольника в левом верхнем углу.