ClipToBound Behavior [Extension]
Aucun commentaire
Comme beaucoup d'autres petits détails, vous aurez sans aucun doute remarqué qu'il n'est pas possible de définir la propriété ClipToBounds dans Silverlight contrairement à WPF. Autrement dit, vous ne pouvez pas faire en sorte qu'un objet contenu dans un autre ne dépasse pas des limites de son parent sauf si cela est prévu nativement. Comme d'habitude, la solution consiste à créer une extension ou un comportement. J'ai fais une propriété attachée ainsi qu'un comportement qui facilitent cette mise en oeuvre.
Voici une copie d'écran réalisée sous Blend.
Et voici le code très simpliste qui permet de créer cet effet via une AttachedProperty :
public static class ClippingExtension { public static bool GetClipToBounds(DependencyObject obj) { return (bool)obj.GetValue(ClipToBoundsProperty); } public static void SetClipToBounds(DependencyObject obj, bool value) { obj.SetValue(ClipToBoundsProperty, value); } // Using a DependencyProperty as the backing store for ClipToBounds. This enables animation, styling, binding, etc... public static readonly DependencyProperty ClipToBoundsProperty = DependencyProperty.RegisterAttached("ClipToBounds", typeof(bool), typeof(FrameworkElement), new PropertyMetadata(false,OnClipToBoundsChanged)); private static void OnClipToBoundsChanged (DependencyObject d, DependencyPropertyChangedEventArgs e) { FrameworkElement f = d as FrameworkElement; if (f == null) { return; } if (System.Convert.ToBoolean(e.NewValue)) { f.SizeChanged += new SizeChangedEventHandler(f_SizeChanged); RectangleGeometry rg = new RectangleGeometry(); rg.Rect = new Rect() { Width = f.ActualWidth, Height = f.ActualHeight }; f.Clip = rg; } else { f.SizeChanged -= new SizeChangedEventHandler(f_SizeChanged); f.Clip = null; } } static void f_SizeChanged(object sender, SizeChangedEventArgs e) { FrameworkElement f = sender as FrameworkElement; if (f == null) { return; } RectangleGeometry rg = new RectangleGeometry(); rg.Rect = new Rect() { Width=f.RenderSize.Width, Height=f.RenderSize.Height }; f.Clip = rg; } }




