我有一个WPF RichTextBox,我想让用户更改字体大小:
void SetFontSize(double size)
{
var selection = richTextBox.Selection;
if (selection.IsEmpty)
richTextBox.FontSize = size;
else
selection.ApplyPropertyValue(RichTextBox.FontSizeProperty, size);
}
在现实世界中,它嵌入在System.Windows.Forms.Integration.ElementHost()中并且应该从其WinForms父级继承该字体,但我可以在100%WPF中重现此问题场景。
问题是字体大小似乎是设置的3/4。所以WinForms字体是8.5,它将其转换为11 1/3。如果我回读字体大小,它声称它是11.33333,但是如果我将文本复制并粘贴到wordpad中,则表示字体大小为8.5。
如果我尝试重新设置字体以匹配父控件8.5,那么它会将其设置为3/4,即6.375,太小而无法读取。我必须将其设置为4/3 * 8.5才能使其与WinForms字体大小匹配。
我用10.0调用上面的示例代码,然后将文本复制到wordpad中,它说我有7.5磅字体。等等。
我没有进行任何UI缩放。 Windows屏幕分辨率设置为100%。我覆盖了ElementHost父控件中的ScaleCore并放置了一个断点,它显示缩放设置为1:1。
为什么它会缩放3/4?这是一个通用常数,每当我从这个控件读取/写入字体大小时,我应该乘以和除以?
答案 0 :(得分:0)
您指定的FontSize
应该是DIP(与设备无关的像素)。
https://www.codeproject.com/articles/43520/device-independent-units-to-points-to-inches.aspx
https://msdn.microsoft.com/en-us/library/system.windows.controls.control.fontsize(v=vs.110).aspx
当RichTextBox
给出一个大小时,它会计算/将其映射回最接近的点大小。
因此,您需要进行计算以计算DIP值,最终会在RichTextBox
中为您提供所需的“PointSize”。
double sizeindips = (double) new FontSizeConverter().ConvertFrom("8.5pt");
当在XAML中使用“pt”后缀指定大小时,这实际上是由“转换器”在下面调用的。