Вопрос:
У меня есть приложение WPF с несколькими элементами управления в каждом окне, некоторые оверлейные и т.д., что мне нужно, это способ автоматического изменения размера приложения в зависимости от разрешения экрана.
Любые идеи?
Лучший ответ:
Просто создайте привязку:
<Window x:Class=»YourApplication.MainWindow» xmlns=»http://schemas.microsoft.com/winfx/2006/xaml/presentation» xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml» Title=»YourApplication» Height=»{Binding SystemParameters.PrimaryScreenHeight}» Width=»{Binding SystemParameters.PrimaryScreenWidth}»> Ответ №1
Синтаксис Height = “{Binding SystemParameters.PrimaryScreenHeight}” дает ключ, но не работает как таковой. SystemParameters.PrimaryScreenHeight является статическим, поэтому вы должны использовать:
<Window x:Class=»MyApp.MainWindow» xmlns=»http://schemas.microsoft.com/winfx/2006/xaml/presentation» xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml» xmlns:tools=»clr-namespace:MyApp.Tools» Height=»{x:Static SystemParameters.PrimaryScreenHeight}» Width=»{x:Static SystemParameters.PrimaryScreenWidth}» Title=»{Binding Path=DisplayName}» WindowStartupLocation=»CenterScreen» Icon=»icon.ico» >
И это будет соответствовать всему экрану. Тем не менее, вы можете предпочесть размер процента размера экрана, например. 90%, и в этом случае синтаксис должен быть изменен с помощью конвертера в спецификации привязки:
<Window x:Class=»MyApp.MainWindow» xmlns=»http://schemas.microsoft.com/winfx/2006/xaml/presentation» xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml» xmlns:tools=»clr-namespace:MyApp.Tools» Height=»{Binding Source={x:Static SystemParameters.PrimaryScreenHeight}, Converter={tools:RatioConverter}, ConverterParameter=’0.9′ }» Width=»{Binding Source={x:Static SystemParameters.PrimaryScreenWidth}, Converter={tools:RatioConverter}, ConverterParameter=’0.9′ }» Title=»{Binding Path=DisplayName}» WindowStartupLocation=»CenterScreen» Icon=»icon.ico» >
Здесь RatioConverter объявлен в пространстве имен MyApp.Tools следующим образом:
namespace MyApp.Tools { [ValueConversion(typeof(string), typeof(string))] public class RatioConverter : MarkupExtension, IValueConverter { private static RatioConverter _instance; public RatioConverter() { } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { // do not let the culture default to local to prevent variable outcome re decimal syntax double size = System.Convert.ToDouble(value) * System.Convert.ToDouble(parameter,CultureInfo.InvariantCulture); return size.ToString( «G0», CultureInfo.InvariantCulture ); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { // read only converter… throw new NotImplementedException(); } public override object ProvideValue(IServiceProvider serviceProvider) { return _instance ?? (_instance = new RatioConverter()); } } }
Если определение преобразователя должно наследовать от MarkupExtension, чтобы использоваться непосредственно в корневом элементе без прежнего объявления в качестве ресурса.