Heim > Backend-Entwicklung > C++ > Wie erhalte ich effizient die Abmessungen des aktuellen Bildschirms in WPF?

Wie erhalte ich effizient die Abmessungen des aktuellen Bildschirms in WPF?

Linda Hamilton
Freigeben: 2025-01-04 14:03:39
Original
879 Leute haben es durchsucht

How to Efficiently Get the Current Screen's Dimensions in WPF?

WPF: Erfassen der Abmessungen des aktuellen Bildschirms

Das Abrufen der Größe des primären Bildschirms ist mit SystemParameters unkompliziert, die Größe des aktuellen Bildschirms muss jedoch bestimmt werden Der Bildschirm kann komplexer sein, insbesondere bei Konfigurationen mit mehreren Bildschirmen. Um dieser Herausforderung zu begegnen, sollten Sie den folgenden Ansatz in Betracht ziehen:

Verwendung eines WinForms-Bildschirm-Wrappers

Erstellen eines WPF-kompatiblen Wrappers um das bereitgestellte System.Windows.Forms.Screen-Objekt eine bequeme Möglichkeit, auf bildschirmbezogene Informationen zuzugreifen. Hier ist eine Beispielimplementierung:

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);
        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)
    {
        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; }
    }
}
Nach dem Login kopieren

Zugriff auf Bildschirmabmessungen in XAML

Während der Zugriff auf die Bildschirmgröße über XAML nicht direkt möglich ist, können Sie angehängte Eigenschaften in Kombination verwenden mit der Wrapper-Klasse:

<UserControl>
    <UserControl.Resources>
        <local:WpfScreenExtension x:Key="ScreenExtension" />
    </UserControl.Resources>

    <StackPanel>
        <TextBlock Text="Device Bounds Width: {Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Width, Converter={StaticResource ScreenExtension}}" VerticalAlignment="Center" />
        <TextBlock Text="Working Area Height: {Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=Height, Converter={StaticResource ScreenExtension}}" VerticalAlignment="Center" />
    </StackPanel>
</UserControl>
Nach dem Login kopieren
public class WpfScreenExtension : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        UserControl userControl = value as UserControl;
        if (userControl == null)
            return null;

        Rect bounds = WpfScreen.GetScreenFrom(userControl).DeviceBounds;
        if (bounds.IsEmpty)
            return String.Empty;

        if (parameter?.ToString() == "Width")
            return bounds.Width;
        else if (parameter?.ToString() == "Height")
            return bounds.Height;
        else
            return bounds;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie erhalte ich effizient die Abmessungen des aktuellen Bildschirms in WPF?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage