夜视






3.33/5 (3投票s)
一个具有 80% 不透明度的窗口,
引言
我经常用笔记本电脑看电影。但我使用的是22英寸的液晶显示器,而不是笔记本电脑的屏幕。当我关掉房间的灯时,笔记本电脑屏幕的光线会干扰我。我可以关掉笔记本电脑的屏幕,但如果我想在看电影的同时做其他事情,我需要把它打开。这种体验对我来说不太好。所以,我需要一些能够降低屏幕不透明度,但在鼠标指针周围保留一个小透明区域,让我能够使用其他应用程序的东西。因此,我在Media Assistant中引入了夜视模式。
使用代码
为了解决我在Media Assistant中的问题,我使用了一个全屏窗口,其中包含网格。我创建了一个3x3的网格,中心部分代表整个窗口。这意味着我需要随着鼠标移动来移动它。
这是我在窗口中使用的XAML
<Window x:Class="MediaAssistant.Controls.NightVision.NightVisionWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Converters="clr-namespace:MediaAssistant.Converters" Title="NightVisionWindow" WindowState="Maximized"
Background="Transparent" AllowsTransparency="True"
ResizeMode="NoResize"
WindowStyle="None"
ShowInTaskbar="False"
MouseMove="WindowMouseMove" Topmost="True"
KeyDown="KeyDownHandler"
>
<Window.Resources>
<Converters:NightOpacityToTextConverter x:Key="NightOpacityToTextConverter" />
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="{Binding Y}"/>
<RowDefinition Height="{Binding WholeHeight}"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding X}"/>
<ColumnDefinition Width="{Binding WholeWidth}"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Grid.Row="0" Background="Black" Opacity="{Binding NightOpacity}"/>
<Border Grid.Column="0" Grid.Row="1" Background="Black" Opacity="{Binding NightOpacity}"/>
<Border Grid.Column="0" Grid.Row="2" Background="Black" Opacity="{Binding NightOpacity}"/>
<Border Grid.Column="1" Grid.Row="0" Background="Black" Opacity="{Binding NightOpacity}">
<TextBlock DockPanel.Dock="Top" Text="{Binding NightOpacity, Converter={StaticResource NightOpacityToTextConverter}}" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Bottom"/>
</Border>
<Border Grid.Column="1" Grid.Row="1" Background="Transparent" BorderThickness="2" BorderBrush="Black"/>
<Border Grid.Column="1" Grid.Row="2" Background="Black" Opacity="{Binding NightOpacity}"/>
<Border Grid.Column="2" Grid.Row="0" Background="Black" Opacity="{Binding NightOpacity}"/>
<Border Grid.Column="2" Grid.Row="1" Background="Black" Opacity="{Binding NightOpacity}"/>
<Border Grid.Column="2" Grid.Row="2" Background="Black" Opacity="{Binding NightOpacity}"/>
</Grid>
</Window>
我使用了转换器来显示当前的不透明度,用户可以控制它。我将高度和宽度与属性绑定,并通过鼠标移动来修改该属性。因此,第一行和第一列会随着鼠标移动而重新调整大小。
这是移动整个窗口的代码,跟随鼠标移动。
private void WindowMouseMove(object sender, MouseEventArgs e) { var position = e.GetPosition(this); X = Math.Max(position.X - WholeWidth/2, 0); Y = Math.Max(position.Y - WholeHeight/2, 0); if(IsActive==false) Activate(); }
我还通过键盘交互控制了不透明度和退出行为。
private void KeyDownHandler(object sender, KeyEventArgs e) { if (e.Key == Key.Escape) { Close(); } else { const double delta = 0.05; if(e.Key==Key.Left) { NightOpacity = Math.Max(0, NightOpacity - delta); } else if(e.Key==Key.Right) { NightOpacity = Math.Min(1, NightOpacity + delta); } } }