我想选择一个要点击的UI控件,并半透明地将桌面屏幕的其余部分灰显。我在想整个屏幕上的位图画,但这是一个非常缓慢的过程。我想有人在WPF知道如何做到这一点。我没有WPF的经验。我想在Windows 7上执行此操作。
答案 0 :(得分:3)
基本上,您希望显示一个顶级全屏透明窗口,该窗口不可聚焦且不响应输入。然后,您可以使用此窗口手动绘制叠加层。我认为最简单的方法是在窗口上覆盖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的正确位置和大小。
如果您运行此代码,您将看到屏幕显示为灰色,除了左上方的一个小矩形。
答案 1 :(得分:0)
我使用了这段代码。但看起来它没有使用OnRender。它只显示白色窗口。
namespace GrayOutTEST
{
class MainWindow1 : Window
{
private Window window;
public MainWindow1() { }
public void CreateWindow()
{
window = new Window();
window.Title = "WIndow Title";
window.Height = Screen.PrimaryScreen.Bounds.Height;
window.Width = Screen.PrimaryScreen.Bounds.Width;
window.Topmost = false;
window.IsHitTestVisible = false;
window.AllowsTransparency = true;
window.WindowStyle = WindowStyle.None;
window.WindowState = WindowState.Maximized;
// window.Background = null;
window.Show();
}
public void CloseWindow()
{
window.Close();
}
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(System.Windows.Media.Brushes.Black, null, new Rect(0, 0, ActualWidth, ActualHeight));
drawingContext.Pop(); drawingContext.Pop();
}
[STAThread]
static void Main(string[] args)
{
MainWindow1 w = new MainWindow1();
w.CreateWindow();
Console.Read();
}
}
}
答案 2 :(得分:0)
如果您想模糊MainWindow并专注于新的弹出窗口,可以查看:
System.Windows.Media.Effects.BlurEffect objBlur = new System.Windows.Media.Effects.BlurEffect();
((MainWindow)App.Current.MainWindow).Effect = objBlur;
mainFrame.Navigate(new PopUp_page1());
您也可以使用Window而不是Popup窗口。
删除效果:
((MainWindow)App.Current.MainWindow).Effect = null;