在收听分辨率更改时,使用转换器对半固定尺寸的WPF Windows进行自动调整



我当前正在创建WPF中的 css media/ Android layout -like行为。基本上,我基于屏幕宽度的三个值的分辨率类别:800px,1280px和1920px。

有三个相应的资源词典包含带有UI元素键的Int32值。样本条目是:

<sys:Int32 x:Key="initial_screen_width">1600</sys:Int32>

我的 IConverter只需检查屏幕分辨率级别(基于屏幕宽度的屏幕分辨率级别(,然后以相应的分辨率返回字典中的键:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    int dimension = 0;
    object value2 = value;
    string resourceId = (string)parameter;
    if(resourceId is string)
    {
        dimension = GetDimension(resourceId, GetResolutionLevel());
    }
    return dimension;
}

最后,我只需将UserControl属性与转换器绑定:

<UserControl
...
Height="{Binding Converter={StaticResource LayoutDimensionConverter}, ConverterParameter=initial_screen_height}"
...
>

它可以很好地工作 - 返回相应的维度。但是,我似乎找不到处理分辨率更改的方法(更新UI以再次调整(。我找到了有关使用UpdateTarget

的一些链接
  • wpf力重新启动
  • wpf从system.windows.systemparameters.primaryscreenwidth带有转换器

因此,我尝试使用系统参数作为静态变量,但是未检测到分辨率更改。有办法吗?

这是使用systemevents.displaysettingschanged完成的。

        public SomeView()
        {
            SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged;
        }
        private void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e)
        {
            // Refreshes UI
            var dataContext = DataContext;
            DataContext = null;
            DataContext = dataContext;
        }

每当更改屏幕分辨率时,DataContext是重置的,并且所有值转换器再次发射。

最新更新