ホームページ > バックエンド開発 > C++ > WPF で現在の画面のサイズを効率的に取得する方法は?

WPF で現在の画面のサイズを効率的に取得する方法は?

Linda Hamilton
リリース: 2025-01-04 14:03:39
オリジナル
879 人が閲覧しました

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

WPF: 現在の画面のサイズの取得

主画面のサイズの取得は SystemParameters を使用することで簡単に行えますが、現在の画面のサイズを決定する必要があります。特にマルチスクリーン構成では、画面はより複雑になる可能性があります。この課題に対処するには、次のアプローチを検討してください。

WinForms Screen Wrapper の利用

System.Windows.Forms.Screen オブジェクトの周囲に WPF 互換のラッパーを作成する。画面関連の情報にアクセスする便利な方法です。実装例を次に示します。

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; }
    }
}
ログイン後にコピー

XAML での画面サイズへのアクセス

XAML から画面サイズに直接アクセスすることはできませんが、添付プロパティを組み合わせて利用できます。ラッパークラスの場合:

<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>
ログイン後にコピー
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;
    }
}
ログイン後にコピー

以上がWPF で現在の画面のサイズを効率的に取得する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート