Как получить размер текущего экрана в WPF?

Вот конфигурация Apache httpd, которая должна работать:

RewriteEngine On
RewriteRule   ^/outlook$        https://example.com/email.aspx  [P,L]
RewriteRule   ^/([^./])/?$      https://example.com/$1.aspx     [P,L]

При этом используется обратный прокси-сервер для обслуживания страниц, подобных email.aspx и foobar.aspx, когда даны «outlook» и «foobar» без раскрытия их расширений. пользователям.

1119 Хотя, похоже, вы пытаетесь вернуться назад по какой-то причине. В этом случае вы захотите:

RewriteEngine On
RewriteRule   ^/email\.aspx$    https://example.com/outlook     [L]
RewriteRule   ^/([^.]+)\.aspx$  https://example.com/$1          [L]

& nbsp;

Regex , условные выражения не могут выполнить вашу задачу. Структура регулярного выражения:

(?(condition)yes-pattern|no-pattern)
  • condition является либо
    • утверждением нулевой ширины (обычно предвидением)
    • целое в скобках , обозначая, имеет ли этот пронумерованный захват содержание
    • имя группы захвата в угловых скобках или одинарных кавычках
    • (R), что верно при оценке внутри рекурсии или eval
    [ 1110]
  • yes-pattern - регулярное выражение для сопоставления, если условие истинно
  • no-pattern - необязательное регулярное выражение для сопоставления, если условие ложно

Следовательно, вы не могу вставить новый текст в совпадение с помощью условного выражения.

79
задан Blacktempel 13 September 2016 в 07:27
поделиться

4 ответа

Насколько мне известно, нет собственной функции WPF для получения размеров текущего монитора. Вместо этого вы можете PInvoke встроить функции нескольких мониторов , обернуть их в управляемый класс и предоставить все свойства, необходимые для их использования из XAML.

13
ответ дан 24 November 2019 в 10:18
поделиться

Я создал небольшую обертку вокруг экрана от System.Windows.Forms, в настоящее время все работает ... Не уверен в том, что «Независимые пиксели устройства».

public class WpfScreen
{
    public static IEnumerable<WpfScreen> AllScreens()
    {
        foreach (Screen screen in System.Windows.Forms.Screen.AllScreens)
        {
            yield return new WpfScreen(screen);
        }
    }

    public static WpfScreen GetScreenFrom(Window window)
    {
        WindowInteropHelper windowInteropHelper = new WindowInteropHelper(window);
        Screen screen = System.Windows.Forms.Screen.FromHandle(windowInteropHelper.Handle);
        WpfScreen wpfScreen = new WpfScreen(screen);
        return wpfScreen;
    }

    public static WpfScreen GetScreenFrom(Point point)
    {
        int x = (int) Math.Round(point.X);
        int y = (int) Math.Round(point.Y);

        // are x,y device-independent-pixels ??
        System.Drawing.Point drawingPoint = new System.Drawing.Point(x, y);
        Screen screen = System.Windows.Forms.Screen.FromPoint(drawingPoint);
        WpfScreen wpfScreen = new WpfScreen(screen);

        return wpfScreen;
    }

    public static WpfScreen Primary
    {
        get { return new WpfScreen(System.Windows.Forms.Screen.PrimaryScreen); }
    }

    private readonly Screen screen;

    internal WpfScreen(System.Windows.Forms.Screen screen)
    {
        this.screen = screen;
    }

    public Rect DeviceBounds
    {
        get { return this.GetRect(this.screen.Bounds); }
    }

    public Rect WorkingArea
    {
        get { return this.GetRect(this.screen.WorkingArea); }
    }

    private Rect GetRect(Rectangle value)
    {
        // should x, y, width, height be device-independent-pixels ??
        return new Rect
                   {
                       X = value.X,
                       Y = value.Y,
                       Width = value.Width,
                       Height = value.Height
                   };
    }

    public bool IsPrimary
    {
        get { return this.screen.Primary; }
    }

    public string DeviceName
    {
        get { return this.screen.DeviceName; }
    }
}
68
ответ дан 24 November 2019 в 10:18
поделиться

При использовании какого-либо полноэкранного окна (имеющий WindowState = WindowState.Maximized, WindowStyle = WindowStyle.None), можно перенести его содержание в System.Windows.Controls.Canvas как это:

<Canvas Name="MyCanvas" Width="auto" Height="auto">
...
</Canvas>

Затем можно использовать MyCanvas.ActualWidth и MyCanvas.ActualHeight для получения разрешения текущего экрана с принятыми во внимание настройками DPI и в независимых от устройств единицах. Это не добавляет полей, как само максимизируемое окно делает.

(Холст принимает UIElement с как детей, таким образом, необходимо смочь использовать его с любым содержанием.)

1
ответ дан 24 November 2019 в 10:18
поделиться

Уделите время сканированию членов SystemParameters.

  • VirtualScreenWidth
  • VirtualScreenHeight

Они даже учитывают относительное положение экранов.

Проверено только с двумя мониторами.

5
ответ дан 24 November 2019 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: