Диаметр круга одинаковый на всех разрешениях WPF (независимость разрешения)
У меня есть физический объект в форме круга, который измеряет 3 дюйма в диаметре. Мое приложение переносит эту форму круга на экран, чтобы пользователь мог визуально выделить то, что он видит в приложении, из объекта круга. У меня проблема в том, что мне нужно, чтобы объект круга был 3 дюйма в диаметре и имел одинаковый размер на всех типах мониторов и всех разрешениях.
Это возможно? Я использую WPF и у меня уже есть что-то вроде этого:
<Window.Resources>
<behaviors:InchesToIndependentUnitsConverter x:Key="InchesToDeviceIndependentUnits" />
</Window.Resources>
...
<Ellipse x:Name="MyCircle" Height="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth}" Width="{Binding CircleDiameter, Converter={StaticResource InchesToDeviceIndependentUnits}}" Margin="0,0,0,20" Fill="White" BorderBrush="Black" BorderThickness="1" VerticalAlignment="Top" HorizontalAlignment="Center"></Ellipse>
...
Мой конвертер дюймов в DIU выглядит примерно так:
public class InchesToIndependentUnitsConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo cultureInfo)
{
int diameterDIU = 0;
if ((double)value > 0)
{
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
{
diameterDIU = (int)((g.DpiX / 96) * value);
}
}
return diameterDIU;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo cultureInfo)
{
throw new NotImplementedException();
}
Как и ожидалось, это очень хорошо работает, скажем, на мониторе с разрешением 1920 x 1200, но когда я начинаю опускаться, естественно, все выглядит больше. Мне нужен диаметр моего <Ellipse>
тег всегда должен быть 3 дюйма независимо от разрешения монитора человека.
Спасибо!
1 ответ
У меня есть хорошие и плохие новости для вас.
Хорошей новостью является то, что WPF изначально поддерживает дюймы в качестве единицы размера. Вы можете просто установить Width
а также Height
вашей Ellipse
в 3in
, и вы получите лучшее приближение WPF.
Плохая новость заключается в том, что WPF переводит дюймы в физические пиксели в соответствии с настройками DPI, сообщаемыми Windows, которые часто мало похожи на реальность. Например, Windows давно считает, что дисплей в моем старом ThinkPad имеет высоту 96 точек на дюйм, но на самом деле он ближе к 120 точек на дюйм. В частности, мобильные экраны имеют тенденцию завышать или занижать свою плотность пикселей.
Существует несколько неуправляемых API-интерфейсов, предназначенных для возврата физических размеров дисплея, и, хотя они могут быть более надежными, я подозреваю, что результаты все равно будут попадать или отсутствовать. Наиболее перспективным представляется использование SetupAPI для определения местоположения блока EDID дисплея в реестре. Может быть стоит выстрел. Если он кажется достаточно надежным, вы сможете вручную вычислить эффективный DPI, разделив горизонтальное и вертикальное число пикселей на указанные физические размеры, выполнив любые необходимые преобразования метрики в имперские значения (1 in = 2.54 cm
).