2012-05-21 9 views
5

Dies ist, was mein Steuerbaum wie folgt aussieht:WPF Nested Scrollviewers - Steuerung die zurück zu Eltern scollviewer

<window> 
<scrollviewer> 
    <expander> 
    <scrollviewer> 
    <grid> 
    </grid> 
    </scrollviewer> 
    </expander> 
    <expander> 
    <scrollviewer> 
    <grid> 
    </grid> 
    </scrollviewer> 
    </expander> 
</scrollviewer> 
</window> 

das Mausrad verwenden, automatisch die Steuerung von Eltern geht auf das Kind Scroll, aber wenn ich blättern Sie zu der Ende des untergeordneten Scrollviewers wird das Steuerelement nicht an den übergeordneten scorllviewer zurückgegeben. Wie erreiche ich das?

Der Expander, das Gitter und die Scrollviewer werden dynamisch generiert.

+0

Siehe auch die Antworten auf [diese Frage] (http://stackoverflow.com/q/14348517/1925996). – piedar

Antwort

10

Ich bekomme ein ähnliches Problem in meiner Anwendung. Ich korrigiere es durch eine abhängige Eigenschaft, die das Ereignis auch zu seinem Elternteil verfängt und weitergibt. Dies kann auf jedes Steuerelement angewendet werden, das einen Bildlauf enthält. Aber für mich musste ich nicht überprüfen, ob es am Ende der Schriftrolle war, um es an seine Eltern zu senden. Sie müssen nur in der OnValueChanged-Methode eine Überprüfung hinzufügen, ob sich der Bildlauf am Ende oder an der Spitze befindet, um an seinen Elternteil zu senden.

using System.Windows.Controls; 

public static class SendMouseWheelToParent 
{ 
    public static readonly DependencyProperty ScrollProperty 
    = DependencyProperty.RegisterAttached("IsSendingMouseWheelEventToParent", 
     typeof(bool), 
     typeof(SendMouseWheelToParent), 
     new FrameworkPropertyMetadata(OnValueChanged)); 

    /// <summary> 
    /// Gets the IsSendingMouseWheelEventToParent for a given <see cref="TextBox"/>. 
    /// </summary> 
    /// <param name="control"> 
    /// The <see cref="TextBox"/> whose IsSendingMouseWheelEventToParent is to be retrieved. 
    /// </param> 
    /// <returns> 
    /// The IsSendingMouseWheelEventToParent, or <see langword="null"/> 
    /// if no IsSendingMouseWheelEventToParent has been set. 
    /// </returns> 
    public static bool? GetIsSendingMouseWheelEventToParent(Control control) 
    { 
     if (control == null) 
      throw new ArgumentNullException(""); 

     return control.GetValue(ScrollProperty) as bool?; 
    } 

    /// <summary> 
    /// Sets the IsSendingMouseWheelEventToParent for a given <see cref="TextBox"/>. 
    /// </summary> 
    /// <param name="control"> 
    /// The <see cref="TextBox"/> whose IsSendingMouseWheelEventToParent is to be set. 
    /// </param> 
    /// <param name="IsSendingMouseWheelEventToParent"> 
    /// The IsSendingMouseWheelEventToParent to set, or <see langword="null"/> 
    /// to remove any existing IsSendingMouseWheelEventToParent from <paramref name="control"/>. 
    /// </param> 
    public static void SetIsSendingMouseWheelEventToParent(Control control, bool? sendToParent) 
    { 
     if (control == null) 
      throw new ArgumentNullException(""); 

     control.SetValue(ScrollProperty, sendToParent); 
    } 

    private static void OnValueChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
    { 
     var scrollViewer = dependencyObject as Control; 
     bool? IsSendingMouseWheelEventToParent = e.NewValue as bool?; 
     scrollViewer.PreviewMouseWheel -= scrollViewer_PreviewMouseWheel; 

     if (IsSendingMouseWheelEventToParent != null && IsSendingMouseWheelEventToParent != false) 
     { 
     scrollViewer.SetValue(ScrollProperty, IsSendingMouseWheelEventToParent); 
     scrollViewer.PreviewMouseWheel += scrollViewer_PreviewMouseWheel; 
     } 
    } 


    private static void scrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     var scrollview = sender as Control; 

     var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta); 
     eventArg.RoutedEvent = UIElement.MouseWheelEvent; 
     eventArg.Source = sender; 
     var parent = scrollview.Parent as UIElement; 
     parent.RaiseEvent(eventArg); 
    } 
} 
+0

Ich schlage vor, den visuellen Tree Parent 'VisualTreeHelper.GetParent (scrollview) als UIElement;' anstelle des logischen Tree Parent 'scrollview.Parent als UIElement;' zu verwenden, allerdings muss ich zugeben, dass ich mich nicht an das genaue Konstrukt erinnern kann mit logischen Eltern. – grek40

Verwandte Themen