Ich habe dies mit Hilfe von Kirils Antwort oben zu arbeiten. Der allgemeine Kontext davon ist, dass ich benutzerdefinierte Formulare in meiner Anwendung habe und dieser Code zum Rendern der Steuerelemente in einem Formular verwendet wird.
Meine allgemeine Strategie bestand darin, meine Steuerelemente zu einem Raster hinzuzufügen, dann alle untergeordneten Elemente des ScrollViewers mit VisualTreeHelper zu finden und jedem Steuerelement einen GotFocus-Ereignishandler hinzuzufügen.
Wenn das Steuerelement den Fokus wieder mit VisualTreeHelper erhält, suche ich den visuellen Baum nach dem Steuerelement, dessen Eltern das Raster ist, das durch den ScrollViewer gescrollt wird. Dann scrolle ich den ScrollViewer, um das Steuerelement sichtbar zu machen.
Hier ist der Code (gridRender das Gitter ist, dass die Kontrollen werden hinzugefügt):
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 meine eigene Klasse, die einige nützliche Suchfunktionalität auf die VisualTreeHelper Klasse hinzufügt.
Dank - mit einer kleinen Änderung, die ich als Antwort schreiben würde, es funktionierte sehr gut. Die TransformBounds-Methode für GeneralTransform scheint jedoch eine SL3-Sache zu sein. –
Ich weiß, das ist ein alter Beitrag, aber ich versuche das Gleiche zu tun. Ich verwende diesen Code, aber die Werte für Margin.Left und Margin.Top sind immer 0.Das Steuerelement, zu dem ich blättern möchte, befindet sich in einem Raster im ScrollViewer, und das Steuerelement wird im Raster positioniert, indem ihm ein Zeilen- und Zeilenbereichseigenschaftswert zugewiesen wird. – Jeremy