none
wpf在xaml如何获取屏幕分辨率,并依据其确定本窗体的起始尺寸 RRS feed

  • 问题

  • 版主和各位老师:

    查到wpf获取屏幕分辨率的语句,但都是要通过后台代码计算从而确定本程序窗体的其实尺寸。我想知道,有没有办法直接在xaml中获取?

    谢谢。


    ly_he

    2016年2月6日 6:18

答案

  • @ly_he,

    就算用了绑定你的分辨率依然跟你的xaml没有关系,xaml只是界面语言,用于编辑界面的。获取分辨率还是在后台,可以参考以下code在后台获取分辨率:

    System.Windows.SystemParameters.PrimaryScreenWidth;
    System.Windows.SystemParameters.PrimaryScreenHeight;
    

    当然如果你想根据分辨率调整你的长度和宽度,那用你的绑定的方式是完全可以的,这样可以根据分辨率来调整你的程序的一些界面。

    至于如果你想要设置起始位置,在初始化的时候使用以下属性:

    Window.WindowStartupLocation 


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年2月8日 6:36
    版主
  • @ly_he,

    这个想法是很赞的,用绑定来实现自适应的界面是一个大趋势,所以在微软最新的通用应用(UWP)程序里就设计了:

    AdaptiveTrigger class

    在里面根据不同的屏幕册寸采取不同的显示效果。

    然后还用了RelativePanel class 来做界面上的宽高的绑定。

    回归咱们WPF。首先后台我们已经能得到了宽和高这两个值,这时候我们可以用两个属性来接收宽和高。然后定义依赖属性DependencyProperty 类 用作界面上的绑定。把你的窗体的宽和高绑定到你的依赖属性。具体怎么做我建议你把MSDN的依赖属性读一下。XAML里面没有的东西我们通过WPF特有的方法可以去做到。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年2月18日 1:54
    版主
  • 用Binding  source={x:Static }

            <TextBlock Text="{Binding Source={x:Static SystemParameters.PrimaryScreenWidth}}"/>
            <TextBlock Text="{Binding Source={x:Static SystemParameters.PrimaryScreenHeight}}"/>


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2016年2月25日 7:32
    版主
  • 谢谢各位老师的帮助,我最终是这样实现的:

    namespace ScreenSize
    {
        /// <summary>
        /// App.xaml 的交互逻辑
        /// </summary>
        public partial class App : Application
        {
            void AppStartup(object sender,StartupEventArgs args)
            {
                MainWindow myWindow = new MainWindow();
                myWindow.Title = "Started from the Application.";

                double x = SystemParameters.WorkArea.Width - 60;     //得到屏幕工作区域宽度
                double y = SystemParameters.WorkArea.Height - 60;    //得到屏幕工作区域高度

                myWindow.Width = x;             //设置窗体宽度
                myWindow.Height = y;            //设置窗体高度
                //myWindow.WindowStartupLocation = System.Windows.WindowStartupLocation.Manual;
                myWindow.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;

                myWindow.Show();
            }
        }
    }

    基本达到我的目的。、

    特贴此处,与大家共享。也请各位老师指正。

    ly_he


    ly_he

    2016年3月6日 3:20

全部回复

  • 没有。XAML是用来描绘(或者说构造)交互界面的,不负责逻辑功能。不然还要代码做什么?XAML等同于网页中的HTML,代码等同于js。
    wpf的mainwindow的xaml有两个属性:width和height。有可能为这两个属性使用绑定,通过converter实现获取屏幕分辨率吗?

    ly_he

    2016年2月6日 11:24
  • @ly_he,

    就算用了绑定你的分辨率依然跟你的xaml没有关系,xaml只是界面语言,用于编辑界面的。获取分辨率还是在后台,可以参考以下code在后台获取分辨率:

    System.Windows.SystemParameters.PrimaryScreenWidth;
    System.Windows.SystemParameters.PrimaryScreenHeight;
    

    当然如果你想根据分辨率调整你的长度和宽度,那用你的绑定的方式是完全可以的,这样可以根据分辨率来调整你的程序的一些界面。

    至于如果你想要设置起始位置,在初始化的时候使用以下属性:

    Window.WindowStartupLocation 


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年2月8日 6:36
    版主
  • 谢谢版主。

            public MainWindow()
            {
                InitializeComponent();

                double x = SystemParameters.WorkArea.Width-60;     //得到屏幕工作区域宽度
                double y = SystemParameters.WorkArea.Height-60;    //得到屏幕工作区域高度

                this.Width = x;             //设置窗体宽度
                this.Height = y;            //设置窗体高度
            }

    我目前在后台代码是这样实现的。问题是,如果程序界面元素复杂,这样重新变动窗体尺寸可能会引发一些不必要的动作。所以,我想如果能直接在xaml处绑定window.Width和Window.Height两个属性,实现上述功能就最好了。

    谢谢您的答复。


    ly_he

    2016年2月9日 12:45
  • @ly_he,

    这个想法是很赞的,用绑定来实现自适应的界面是一个大趋势,所以在微软最新的通用应用(UWP)程序里就设计了:

    AdaptiveTrigger class

    在里面根据不同的屏幕册寸采取不同的显示效果。

    然后还用了RelativePanel class 来做界面上的宽高的绑定。

    回归咱们WPF。首先后台我们已经能得到了宽和高这两个值,这时候我们可以用两个属性来接收宽和高。然后定义依赖属性DependencyProperty 类 用作界面上的绑定。把你的窗体的宽和高绑定到你的依赖属性。具体怎么做我建议你把MSDN的依赖属性读一下。XAML里面没有的东西我们通过WPF特有的方法可以去做到。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年2月18日 1:54
    版主
  • 用Binding  source={x:Static }

            <TextBlock Text="{Binding Source={x:Static SystemParameters.PrimaryScreenWidth}}"/>
            <TextBlock Text="{Binding Source={x:Static SystemParameters.PrimaryScreenHeight}}"/>


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2016年2月25日 7:32
    版主
  • 谢谢各位老师的帮助,我最终是这样实现的:

    namespace ScreenSize
    {
        /// <summary>
        /// App.xaml 的交互逻辑
        /// </summary>
        public partial class App : Application
        {
            void AppStartup(object sender,StartupEventArgs args)
            {
                MainWindow myWindow = new MainWindow();
                myWindow.Title = "Started from the Application.";

                double x = SystemParameters.WorkArea.Width - 60;     //得到屏幕工作区域宽度
                double y = SystemParameters.WorkArea.Height - 60;    //得到屏幕工作区域高度

                myWindow.Width = x;             //设置窗体宽度
                myWindow.Height = y;            //设置窗体高度
                //myWindow.WindowStartupLocation = System.Windows.WindowStartupLocation.Manual;
                myWindow.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;

                myWindow.Show();
            }
        }
    }

    基本达到我的目的。、

    特贴此处,与大家共享。也请各位老师指正。

    ly_he


    ly_he

    2016年3月6日 3:20