Я знаю, что это очень старо, но я подумал, что попытаюсь сделать то, что попросил ОП. И как таковая, это моя попытка. Кстати, прежде чем я продолжу, я должен отметить, что по некоторым причинам измерения OP не совсем удавались при использовании DLU, но я думаю, что я достаточно близко подошел. Также, пожалуйста, имейте в виду, что я все еще относительный n00b, когда дело доходит до этого материала ... так что, если я сделал что-то не так или кощунственно ... извинения.
Сначала я должен был найти способ получить ширину и высоту данной буквы данного шрифта (в моем случае, Segoe UI на 10px) ... для чего я использовал этот SO-ответ: как -to-вычисления-wpf-textblock-ширина-для-его-известных-размера-шрифта-и-символов , к которым я сделал статический класс для хранения результирующих значений типа double:
public static class Fonts
{
public static double HorizontalDluMultiplier;
public static double VerticalDluMultiplier;
static Fonts()
{
var formattedText = new FormattedText(
"A",
CultureInfo.CurrentUICulture,
FlowDirection.LeftToRight,
new Typeface("Segoe UI"),
12.0,
Brushes.Black);
Fonts.HorizontalDluMultiplier = formattedText.Width / 4;
Fonts.VerticalDluMultiplier = formattedText.Height / 8;
}
}
После того, как у меня были метрики, мне нужно было создать конвертер WPF, который принимает данный параметр ConverterParameter (в данном случае число в DLU) и выплевывает двойные пиксели. Это конвертер, который я использовал ...
public class HorizontalDluToPixelConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (Double.Parse((parameter as string))) * Fonts.HorizontalDluMultiplier;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Я думаю, само собой разумеется, что у меня была отдельная Вертикальная версия конвертера.
Как только это было сделано, я просто выложил окно в XAML, а когда дело дошло до установки высоты и ширины, используя конвертер. Я использовал одну сетку, чтобы выложить все окно. но чтобы установить ширину столбцов и высоту строк, я использовал конвертер так:
<Window.Resources>
<converters:HorizontalDluToPixelConverter x:Key="HorizontalConverter" />
<converters:VerticalDluToPixelConverter x:Key="VerticalConverter" />
</Window.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="{Binding Converter={StaticResource VerticalConverter}, ConverterParameter=7}" />
etc...
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding Converter={StaticResource HorizontalConverter}, ConverterParameter=7}" />
etc... etc...
</Grid.ColumnDefinitions>
Надеюсь, это поможет и будущим людям (если это действительно полезно хех)