WPF hat die schöne Angewohnheit unabhängig von der Auflösung zu sein. D.h. Komponenten können einfach gezoomt werden. Damit ist es z.B. auch möglich die GUI automatisch an die Fenstergröße anzupassen.
Das Beispiel gibt es wie immer am Ende zum Download. Unser Ziel ist folgende Funktion:
Wird das Fenster größer, dann soll sich automatisch auch der Inhalt des Fensters anpassen. Einen Zoom können wir sehr leicht über ein LayoutTransform erreichen:
<StackPanel.LayoutTransform> <ScaleTransform ScaleX="0.5" ScaleY="0.5" /> </StackPanel.LayoutTransform>
In diesem Fall wird der Inhalt unseres Stackpanels mit einer Größe von 0.5 skaliert, es wird also kleiner. Statt einer festen Skalierung verwenden wir nun ein Property:
private decimal _scale = 1; public decimal Scale { get => _scale; set { _scale = value; OnPropertyChanged(); } }
dieses binden wir an unsere Skalierung:
<StackPanel.LayoutTransform> <ScaleTransform ScaleX="{Binding Scale}" ScaleY="{Binding Scale}" /> </StackPanel.LayoutTransform>
Anschließend berechnen wir nun noch die Skalierung in der „SizeChanged“ Methode:
private void MainWindow_OnSizeChanged(object sender, SizeChangedEventArgs e) { Scale = (decimal) (e.NewSize.Height / OriginalHeight); }
Wobei „OriginalHeight“ eine Konstante ist mit unserer „Original-Höhe“ unseres Fensters.
Fertig! Das war es auch schon, anschließend skaliert das Fenster entsprechend der Größe.
Download des Beispiels
Gesamter Quelltext
public partial class MainWindow : INotifyPropertyChanged { private const int OriginalHeight = 200; private const int OriginalWidth = 300; public MainWindow() { InitializeComponent(); LayoutRoot.DataContext = this; Width = OriginalWidth; Height = OriginalHeight; } private decimal _scale = 1; public decimal Scale { get => _scale; set { _scale = value; OnPropertyChanged(); } } private void MainWindow_OnSizeChanged(object sender, SizeChangedEventArgs e) { Scale = (decimal) (e.NewSize.Height / OriginalHeight); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }