我当前正在创建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
是重置的,并且所有值转换器再次发射。