Wie kann ich die Silverlight Scroll blättern machen ein untergeordnetes Steuerelement mit Fokus zu zeigen?

StackOverflow https://stackoverflow.com/questions/1225318

  •  22-07-2019
  •  | 
  •  

Frage

Ich habe eine Scroll, die ein Gitter mit mehreren Steuerungen in die er enthält. Der Benutzer kann Registerkarte durch die Kontrollen, aber sie schließlich Registerkarte zu einer Kontrolle, die nicht sichtbar ist -. So müssen sie manully bewegen die Steuerung wieder sichtbar zu machen

Gibt es eine Möglichkeit, die Scroll blättert automatisch zu machen, so dass die fokussierte Steuerung immer sichtbar ist. Gelingt das nicht, ist es eine Möglichkeit, diese Arbeit zu machen, kurz auf jeder Steuerung zu einem GotFocus-Ereignisse hören und Scrollen dann die Scroll des Steuerelement sichtbar zu machen?

Derzeit ich bin mit Silverlight 2.

War es hilfreich?

Lösung

Getestet habe ich diese mit Silverlight 3. Ich über SL2 nicht sicher bin.

Das ist mein XAML:

<ScrollViewer Height="200" Width="200" KeyUp="ScrollViewer_KeyUp">
    <StackPanel>
        <Button Content="1" Height="20" />
        <Button Content="2" Height="20" />
        <Button Content="3" Height="20" />
        <Button Content="4" Height="20" />
        <Button Content="5" Height="20" />
        <Button Content="6" Height="20" />
        <Button Content="7" Height="20" />
        <Button Content="8" Height="20" />
        <Button Content="9" Height="20" />
    <Button Content="10" Height="20" />
        <Button Content="11" Height="20" />
        <Button Content="12" Height="20" />
        <Button Content="13" Height="20" />
        <Button Content="14" Height="20" />
        <Button Content="15" Height="20" />
        <Button Content="16" Height="20" />
        <Button Content="17" Height="20" />
        <Button Content="18" Height="20" />
        <Button Content="19" Height="20" />
        <Button Content="20" Height="20" />
    </StackPanel>
</ScrollViewer>

Und das ist der Code-behind:

private void ScrollViewer_KeyUp(object sender, KeyEventArgs e)
{
    ScrollViewer scrollViewer = sender as ScrollViewer;
    FrameworkElement focusedElement = FocusManager.GetFocusedElement() as FrameworkElement;
    GeneralTransform focusedVisualTransform = focusedElement.TransformToVisual(scrollViewer);
    Rect rectangle = focusedVisualTransform.TransformBounds(new Rect(new Point(focusedElement.Margin.Left, focusedElement.Margin.Top), focusedElement.RenderSize));
    double newOffset = scrollViewer.VerticalOffset + (rectangle.Bottom - scrollViewer.ViewportHeight);
    scrollViewer.ScrollToVerticalOffset(newOffset);
}

Was ich tat, war auf der Taste 1 und Tab klicken, bis ich zu Button # 20 zu bekommen. Er arbeitete für mich. Probieren Sie es aus und lassen Sie mich wissen, wie es für Sie arbeitet.

Andere Tipps

Der Silverlight-Toolkit enthält eine Methode "ScrollIntoView".

einen Verweis auf System.Windows.Controls.Toolkit.dll hinzufügen am sollten Sie den Code unten verwenden können.

scrollViewer.ScrollIntoView(control);

Nur eine leichte Verbesserung. Noch müssen diese für Silverlight 4 durch die Art und Weise zu tun. Statt GotFocus für jede Kontrolle Sie den GotFocus des Scroll umgehen kann selbst und setzt es nur einmal.

 private void _ScrollViewer_GotFocus(object sender, RoutedEventArgs e)
        {
            FrameworkElement element = e.OriginalSource as FrameworkElement;

            if (element != null)
            {
                ScrollViewer scrollViewer = sender as ScrollViewer;
                scrollViewer.ScrollToVerticalOffset(GetVerticalOffset(element, scrollViewer));
            }

        }

        private double GetVerticalOffset(FrameworkElement child, ScrollViewer scrollViewer)
        {
            // Ensure the control is scrolled into view in the ScrollViewer. 
            GeneralTransform focusedVisualTransform = child.TransformToVisual(scrollViewer);
            Point topLeft = focusedVisualTransform.Transform(new Point(child.Margin.Left, child.Margin.Top));
            Rect rectangle = new Rect(topLeft, child.RenderSize);
            double newOffset = scrollViewer.VerticalOffset + (rectangle.Bottom - scrollViewer.ViewportHeight);
            return newOffset < 0 ? 0 : newOffset; // no use returning negative offset
        }

Ich habe dies funktioniert, mit Hilfe von Kiril Antwort oben. Der allgemeine Kontext ist, dass ich vom Benutzer definierbaren Formen in meiner Anwendung habe, und dieser Code wird für die Darstellung der Steuerelemente auf einem Formular verwendet wird.

Meine allgemeine Strategie war es, meine Kontrollen zu einem Gitter hinzufügen, dann alle Kinder des Scroll mit VisualTreeHelper finden, und fügen Sie zu jeder Kontrolle einen GotFocus-Ereignishandler.

Wenn wird das Steuerelement den Fokus wieder VisualTreeHelper verwendet wird, suche ich die visuelle Struktur, um die Kontrolle zu finden, deren Eltern ist das Gitter, die durch die Scroll gescrollt wird. Dann blättere ich die Scroll das Steuerelement sichtbar zu machen.

Hier ist der Code (gridRender ist das Gitter, dass die Kontrollen werden zu):

private void AfterFormRendered()
{
    var controls = VisualTreeHelperUtil.FindChildren<Control>(gridRender);
    foreach (var ctrl in controls)
    {
        ctrl.GotFocus += CtrlGotFocus;
    }
}

private void CtrlGotFocus(object sender, RoutedEventArgs e)
{
    var ctrl = sender as Control;
    var gridChildControl = VisualTreeHelperUtil.FindParentWithParent(ctrl, gridRender) as FrameworkElement;

    if (gridChildControl != null)
    {
        // Ensure the control is scrolled into view in the ScrollViewer.
        GeneralTransform focusedVisualTransform = gridChildControl.TransformToVisual(scrollViewer);
        Point topLeft = focusedVisualTransform.Transform(new Point(gridChildControl.Margin.Left, gridChildControl.Margin.Top));
        Rect rectangle = new Rect(topLeft, gridChildControl.RenderSize);
        double newOffset = scrollViewer.VerticalOffset + (rectangle.Bottom - scrollViewer.ViewportHeight);    

        scrollViewer.ScrollToVerticalOffset(newOffset);
    }
}

. Hinweis: die VisualTreeHelperUtil Klasse ist meine eigene Klasse, die einige nützliche Suchfunktionalität auf die VisualTreeHelper Klasse fügt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top