Xaml Windows应用商店通用应用程序(W8.1&x2B;WP8.1)中的字体大小缩放
如何在Windows应用商店通用应用程序(W8.1+WP8.1)中缩放文本?基本上,无论使用哪种设备/分辨率,应用程序的外观都应该相同。目前的情况是,除了文本(字体大小)外,版面(基于动态网格的版面)和图像的缩放效果良好 显示的文本在WVGA分辨率(480×800)下看起来不错,但在1080p分辨率下却非常小 我已经读了很多东西,比如 或 但我仍然不知道如何缩放文本以保持可读性,而不考虑显示分辨率/DPI 当然,我可以编写一个类,使用该属性将字体大小转换为适当的值 例如:Xaml Windows应用商店通用应用程序(W8.1&x2B;WP8.1)中的字体大小缩放,xaml,windows-phone-8.1,windows-8.1,win-universal-app,windows-8.1-universal,Xaml,Windows Phone 8.1,Windows 8.1,Win Universal App,Windows 8.1 Universal,如何在Windows应用商店通用应用程序(W8.1+WP8.1)中缩放文本?基本上,无论使用哪种设备/分辨率,应用程序的外观都应该相同。目前的情况是,除了文本(字体大小)外,版面(基于动态网格的版面)和图像的缩放效果良好 显示的文本在WVGA分辨率(480×800)下看起来不错,但在1080p分辨率下却非常小 我已经读了很多东西,比如 或 但我仍然不知道如何缩放文本以保持可读性,而不考虑显示分辨率/DPI 当然,我可以编写一个类,使用该属性将字体大小转换为适当的值 例如: 带ScaleFac
- 带ScaleFactor 1x的WVGA上的FontSize 16等于FontSize 16
- 缩放因子为1.6x的WXGA上的FontSize 16等于FontSize 25,6
- 720p上的FontSize 16,ScaleFactor 1.5x等于FontSize 24
- 1080p上的FontSize 16,ScaleFactor为2.25x等于FontSize 36
编辑:恐怕我没能把问题说清楚:(左边是WVGA,右边是1080p)
WinRT可以根据显示器的像素密度自动缩放其上运行的所有内容。在Windows8.0中,它曾在100%、140%和180%的范围内扩展。较新的版本可能有更多的比例因子。我不相信你可以选择退出这个缩放
如果您对使用在系统级别上运行的内置扩展不感兴趣,那么您几乎不得不自己做所有事情。您可以通过设置字体大小手动缩放文本,也可以使用转换功能来缩放文本或整个UI。我为Windows应用商店应用程序所做的是将FontSize属性绑定到页面高度并转换值(在找到适合您的案例的正确值之前,您必须播放一段时间)
它并不完美,但在我找到一个更好的解决方案之前,它运行得相当好 我正在等待答案,我自己也发布了一个相关问题。
作为一个临时解决方案,我使用了一个iValueConverter,它在某些分辨率下工作,但在其他分辨率下不工作 我的意见如下:
class FontSizeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
var display = Helpers.ScreenResolution();
var height = display.Height;
var oldFontSize = (int)value;
if(oldFontSize == null) return;
// Calculate the new Fontsize based on the designed Fontsize
// and design display size in Visual Studio designer...
var newFontSize = (int)Math.Round((oldFontSize / 768.0) * height, 0);
return newFontSize;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}}
我希望这有助于…您的示例图像具有误导性,因为设备的实际大小也会有所不同。告诉您如何设置模拟器以获得更精确的表示 如果你想在每个屏幕上显示完全相同的内容(即,一部6英寸的手机只显示4英寸手机的放大版,而不是显示50%以上的内容),那么就使用一个按钮来扩展你的应用程序。不过,这并不是一个特别好的用户体验。我发现,当与属性结合使用时,使用该方法效果非常好:
class ScaleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
var resolutionScale = (int)DisplayInformation.GetForCurrentView().ResolutionScale / 100.0;
var baseValue = int.Parse(parameter as string);
var scaledValue = baseValue * resolutionScale;
if (targetType == typeof(GridLength))
return new GridLength(scaledValue);
return scaledValue;
}
}
请注意,如果您使用超过FontSize(因为我也使用它来定义ColumnDefinition.Width),您将需要处理返回正确类型的输出
我的XAML用法如下所示:
<TextBlock Text="string" FontSize="{Binding ElementName=root, Path=ActualHeight, Converter={StaticResource ScaleConverter}, ConverterParameter='30'}" />
为了完成此解决方案,对于每个使用此功能的XAML页面,您需要包括以下内容,用您正在使用的任何类替换SwapChainBackgroundPanel,并正确定义xml命名空间:
<SwapChainBackgroundPanel.Resources>
<local:ScaleConverter x:Key="ScaleConverter"></local:ScaleConverter>
</SwapChainBackgroundPanel.Resources>
UI可以毫无问题地扩展。字体大小是个问题。如何在W8.1、WP8.1中启用字体大小缩放?WinRT也会自动缩放字体大小。尝试进入“设置->电脑和设备->显示->更多选项”,然后选择“默认/更大”,查看差异。您解决了这个问题吗?我也有同样的问题,找不到任何好的信息。不,我没有。我想知道其他开发者是如何解决这个问题的。也许我们找错人了?看来我也有同样的问题,找不到解决办法。。。
<TextBlock Text="string" FontSize="{Binding ElementName=root, Path=ActualHeight, Converter={StaticResource ScaleConverter}, ConverterParameter='30'}" />
<SwapChainBackgroundPanel.Resources>
<local:ScaleConverter x:Key="ScaleConverter"></local:ScaleConverter>
</SwapChainBackgroundPanel.Resources>