Home > Backend Development > C++ > How to Efficiently Get the Current Screen's Dimensions in WPF?

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

Linda Hamilton
Release: 2025-01-04 14:03:39
Original
879 people have browsed it

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

WPF: Acquiring the Current Screen's Dimensions

Retrieving the size of the primary screen is straightforward using SystemParameters, but determining the size of the current screen can be more complex, especially in multi-screen configurations. To address this challenge, consider the following approach:

Utilizing a WinForms Screen Wrapper

Creating a WPF-compatible wrapper around the System.Windows.Forms.Screen object provides a convenient way to access screen-related information. Here's an example implementation:

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; }
    }
}
Copy after login

Accessing Screen Dimensions in XAML

While accessing the screen size from XAML is not directly possible, you can utilize attached properties in combination with the wrapper class:

<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>
Copy after login
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;
    }
}
Copy after login

The above is the detailed content of How to Efficiently Get the Current Screen's Dimensions in WPF?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template