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 サイトの他の関連記事を参照してください。