Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Avalonia用户界面扩展问题_C#_User Interface_Resize_Avaloniaui - Fatal编程技术网

C# Avalonia用户界面扩展问题

C# Avalonia用户界面扩展问题,c#,user-interface,resize,avaloniaui,C#,User Interface,Resize,Avaloniaui,我正在使用Avalonia开发一个跨平台的桌面MVVM应用程序,我的问题很简单: 我想使整个窗口适应目标设备的显示分辨率。例如,用户界面应始终缩放,以覆盖25%到50%的显示,但不应更大。缩放应包括所有字体大小、宽度和高度属性等。要将其可视化,这里是它在我的4K桌面上的外观,这就是它的外观: 在分辨率较低的linux笔记本电脑上,它看起来是这样的: 我想做的是根据显示分辨率放大或缩小所有内容,这样它就不会看起来像垃圾,并且字体总是清晰可读(所以字体也需要缩放)。 (可能还有一个WinAPI调

我正在使用Avalonia开发一个跨平台的桌面MVVM应用程序,我的问题很简单:

我想使整个窗口适应目标设备的显示分辨率。例如,用户界面应始终缩放,以覆盖25%到50%的显示,但不应更大。缩放应包括所有字体大小、宽度和高度属性等。要将其可视化,这里是它在我的4K桌面上的外观,这就是它的外观:

在分辨率较低的linux笔记本电脑上,它看起来是这样的:

我想做的是根据显示分辨率放大或缩小所有内容,这样它就不会看起来像垃圾,并且字体总是清晰可读(所以字体也需要缩放)。 (可能还有一个WinAPI调用用于UI扩展,但该解决方案也应该适用于linux和OSX)

如何使用Avalonia实现这一点?还是有更好的方法来实现这一点?

请注意,应用程序的宽高比应保持不变,并且应用程序不应覆盖整个屏幕

我目前的想法:

  • 我可能会为每个大小参数创建绑定,并在应用程序启动时使用某种比例因子重新计算最佳大小,但这将需要大量新代码,而且使用字体大小实现会很困难

  • 也许可以创建绑定和一堆样式预设,比如CSS媒体查询?不过,这也是一堆工作

是否有更好的方法达到预期效果

我可能会为每个大小参数创建绑定,并在应用程序启动时使用某种比例因子重新计算最佳大小,但这将需要大量新代码,而且使用字体大小实现会很困难

这就是我所做的。我必须创建一个完整的单独名称空间来容纳完成此操作所需的所有类。所以如果有人感兴趣的话,在这个答案中放太多代码了

基本上,这一切都归结为在Avalonia LogicalTree上进行如下迭代:

//
///递归地将所有的注册到。
/// 
///包含将递归注册的根控件的。
///将注册到。
公共静态无效注册表控件(队列逻辑、BindingContext)
{
while(logicals.Count>0)
{
IEnumerable children=logicals.Dequeue();
foreach(儿童中的逻辑儿童)
{
logicals.Enqueue(child.GetLogicalChildren());
if(子对象是AvaloniaObject AvaloniaObject)
{
ScalableObject ScalableObject=新的ScalableObject(avaloniaObject);
bindingContext.Add(scalableObject);
}
}
}
}
其中,my
ScalableObject
的构造函数如下所示:

//
///从提供的中初始化新的。
/// 
///要映射到此的新实例的。
公共可缩放对象(AvaloniaObject AvaloniaObject)
{
if(对象为TextBlock TextBlock)
{
寄存器(对象,TextBlock.FontSizeProperty,TextBlock.FontSize);
}
if(对象为TemplatedControl TemplatedControl)
{
寄存器(对象,TemplatedControl.FontSizeProperty,TemplatedControl.FontSize);
}
如果(对象是边界)
{
寄存器(对象,Border.CornerRadiusProperty,Border.CornerRadius);
}
//……这种情况持续了一段时间
}
然后,我可以在所有创建的绑定上应用一个新的UI比例因子,如下所示:

//
///将指定的应用于此及其所有子项。
/// 
///要应用于所有这些对象的比例因子。
公共无效应用程序缩放(双缩放因子)
{
PreCalingAction?.Invoke();
foreach(Bindings.Values中的可扩展绑定)
{
绑定。应用缩放(缩放因子);
}
PostScalingAction?.Invoke();
}
同样,这个答案中的代码实在太多了,但希望它能让您了解我的解决方案是如何实现的

结果是:

可以扩展到这个

我可能会为每个大小参数创建绑定,并在应用程序启动时使用某种比例因子重新计算最佳大小,但这将需要大量新代码,而且使用字体大小实现会很困难

这就是我所做的。我必须创建一个完整的单独名称空间来容纳完成此操作所需的所有类。所以如果有人感兴趣的话,在这个答案中放太多代码了

基本上,这一切都归结为在Avalonia LogicalTree上进行如下迭代:

//
///递归地将所有的注册到。
/// 
///包含将递归注册的根控件的。
///将注册到。
公共静态无效注册表控件(队列逻辑、BindingContext)
{
while(logicals.Count>0)
{
IEnumerable children=logicals.Dequeue();
foreach(儿童中的逻辑儿童)
{
logicals.Enqueue(child.GetLogicalChildren());
if(子对象是AvaloniaObject AvaloniaObject)
{
ScalableObject ScalableObject=新的ScalableObject(avaloniaObject);
bindingContext.Add(scalableObject);
}
}
}
}
其中,my
ScalableObject
的构造函数如下所示:

//
///从提供的中初始化新的。
/// 
///要映射到此的新实例的。
公共可缩放对象(AvaloniaObject AvaloniaObject)
{
if(对象为TextBlock TextBlock)
{
寄存器(对象,TextBlock.FontSizeProperty,TextBlock.FontSize);
}
如果(i)