2012-05-21 12 views
5

To co moje drzewo kontrola wygląda następująco:WPF zagnieżdżone Scrollviewers - daje kontrolę z powrotem do macierzystej scollviewer

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

za pomocą kółka myszy, sterowanie automatycznie przechodzi z rodziców na ScrollViewer dziecka, ale kiedy przejść do koniec przewijania podrzędnego kontrolka nie przechodzi z powrotem do rodzica scorllviewer. Jak to osiągnąć?

Ekspander, siatka i przewijarki są generowane dynamicznie.

+0

Zobacz także odpowiedzi na [to pytanie] (http://stackoverflow.com/q/14348517/1925996). – piedar

Odpowiedz

10

Mam podobny problem w mojej aplikacji. Poprawiam to za pomocą właściwości depency, która złapie i przekaże wydarzenie również swojemu rodzicowi. Można to zastosować do dowolnego elementu sterującego, który ma w sobie zwój. Ale dla mnie nie musiałem sprawdzać, czy na końcu zwoju było wysyłane do rodzica. W metodzie OnValueChanged musisz po prostu dodać poprawność, jeśli przewijanie znajduje się na końcu lub na górze, aby wysłać do rodzica.

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

Proponuję użyć wizualnego drzewa macierzystego 'VisualTreeHelper.GetParent (scrollview) jako UIElement;' zamiast logicznego drzewa macierzystego 'scrollview.Parent jako UIElement;', jednak muszę przyznać, że nie pamiętam dokładnego konstruktu, który mnie zawiódł z logicznymi rodzicami. – grek40

Powiązane problemy