Wenn man in WPF ein Fenster von dieser Klasse ableitet, kann man den Inhalt größer und kleiner Zoomen, indem man die Strg-Taste gedrückt hält und das Mausrad benutzt. Die Zoomgeschwindigkeit hängt dabei von den übermitelten Delta-Werten ab. Ob man zoomen kann, wird durch eine Eigenschaft geregelt. Die momentane Größe kann von einer anderen Eigenschaft abgerufen werden (in Prozent).
Die Klasse lässt noch viel offen für Erweiterungen. Wenn jemand Vorschläge hat oder Hilfe braucht: Ab in die Kommentare :)
Benötigte Namespaces
System
System.Windows
System.Windows.Controls
System.Windows.Input
System.Windows.Markup
System.Windows.Media
/// <summary>
/// Stellt ein Windows Anwendungsfnester dar, welches die Basisimplementation eine Zoomfunktion besitzt.
/// </summary>
[ContentProperty("ZoomableContent")]
public class ZoomableWindow : Window
{
public ZoomableWindow()
{
this.border = new Border();
this.border.PreviewMouseWheel += this_PreviewMouseWheel;
this.border.LayoutTransform = this.zoom = new ScaleTransform();
base.Content = scrollViewer = new ScrollViewer()
{
HorizontalScrollBarVisibility = ScrollBarVisibility.Auto,
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
Content = border,
Background = Brushes.Transparent,
};
}
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (e.Property == Control.BackgroundProperty)
{
//Hintergrund des Borders auf die Farbe des Fensters setzen
border.Background = (Brush)e.NewValue;
}
}
public UIElement ZoomableContent
{
get
{
return this.border.Child;
}
set
{
this.border.Child = value;
}
}
private new object Content
{
get { throw new NotSupportedException(); }
set { throw new NotSupportedException(); }
}
Border border;
ScaleTransform zoom;
ScrollViewer scrollViewer;
void SetZoomFactorInternal(double d)
{
if (d <= 0)
throw new NotSupportedException();
zoom.ScaleX = d;
zoom.ScaleY = d;
}
void this_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
if (this.AllowZoom)
{
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{
var p = Math.Abs(e.Delta) / 100D + 1D;//Prozent ermitteln, mit den die aktuelle Zoomtiefe verändert wird
if (e.Delta > 0)
this.ZoomFactor *= p;
else if (e.Delta < 0)
this.ZoomFactor *= 1 / p;
SetZoomFactorInternal(this.ZoomFactor);
}
e.Handled = true;
}
}
private static void OnZoomFactorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
(d as ZoomableWindow).SetZoomFactorInternal((double)e.NewValue);
}
/// <summary>
/// Ruft einen Wert ab, der angibt ob de Benutzer zoomen kann oder legt diesen Wert fest.
/// </summary>
public bool AllowZoom
{
get { return (bool)GetValue(AllowZoomProperty); }
set { SetValue(AllowZoomProperty, value); }
}
/// <summary>
/// Ruft den Prozentsatz ab, auf den das Fenster gezoomt wurde oder legt den Prozentsatz fest.
/// </summary>
public double ZoomFactor
{
get { return (double)GetValue(ZoomFactorProperty); }
set { SetValue(ZoomFactorProperty, value); }
}
/// <summary>
/// Bezeichnet die <see cref="AllowZoom"/>-Abhängigkeitseigenschaft.
/// </summary>
public static readonly DependencyProperty AllowZoomProperty = DependencyProperty.Register("AllowZoom", typeof(bool), typeof(ZoomableWindow), new PropertyMetadata(true));
/// <summary>
/// Bezeichnet die <see cref="ZoomFactor"/>-Abhängigkeitseigenschaft.
/// </summary>
public static readonly DependencyProperty ZoomFactorProperty = DependencyProperty.Register("ZoomFactor", typeof(double), typeof(ZoomableWindow), new PropertyMetadata(1D, OnZoomFactorChanged));
}
Kommentare zum Snippet