Серый экран рабочего стола, кроме выбранного элемента управления в C # - PullRequest
2 голосов
/ 29 апреля 2011

Я хочу выбрать элемент управления пользовательского интерфейса, который нужно щелкнуть, и затемнить серым цветом остальную часть экрана рабочего стола.Я думал о растровом рисовании всего экрана, но это очень медленный процесс.Я думаю, кто-то знает в WPF, как это сделать.У меня нет опыта в WPF.Я хотел сделать это на Windows 7.

Ответы [ 3 ]

3 голосов
/ 29 апреля 2011

По сути, вы хотите показать полноэкранное прозрачное окно верхнего уровня, которое не фокусируется и не реагирует на ввод.Затем вы можете использовать это окно, чтобы нарисовать оверлей вручную.Я думаю, что самым простым способом было бы переопределить 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.

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

0 голосов
/ 21 июля 2016

Если вы хотите размыть главное окно и сфокусироваться на новом всплывающем окне, вы можете проверить это:

System.Windows.Media.Effects.BlurEffect objBlur = new System.Windows.Media.Effects.BlurEffect();
((MainWindow)App.Current.MainWindow).Effect = objBlur;

mainFrame.Navigate(new PopUp_page1());

Вы также можете использовать Окно вместо всплывающего окна.эффект:

((MainWindow)App.Current.MainWindow).Effect = null;
0 голосов
/ 04 мая 2011

Я использовал этот код. Но похоже, что он не использует 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();
    }

}
}
...