当选中复合XAML控件时,如何确保整个父控件可见?

时间:2015-10-28 20:25:07

标签: c# wpf xaml

我有一个复合XAML控件。它看起来像这样:

<UI:CompoundControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Dynamics="clr-namespace:MyNamespace.UI" Height="Auto" >
    <Stackpanel Orietnation="Vertical">
        <TextArea x:Name="lblTop" DockPanel.Dock="Left">Label</TextArea >
        <TextArea x:Name="lblBottom" DockPanel.Dock="Left">Label</TextArea >
    </Stackpanel >
</UI:CompoundControl>

当应用程序运行时,会有一个这些CompoundControl的UIElementCollection,它们将它们显示在一个可滚动的列表中。

当我按 Tab 键时,应用程序按顺序将焦点移动到下一个TextArea,滚动视图以执行此操作。但是,它只会滚动显示聚焦控件,因此我遇到了一个问题,即按 Tab 并不显示{{kbd>整个{{ 1}},只有上半部分。

我可以设置一些属性,以便自动滚动显示整个控件,而不仅仅是上半部分吗?

1 个答案:

答案 0 :(得分:0)

通过响应top控件的“GotFocus”事件找到一种方法使其工作。在这种情况下,scrollViewer是添加了复合控件的父ScrollViewer。

private const int SCROLL_PADDING = 10;
private void lblTop_GotKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e)
        {
            if (scrollViewer == null) return;
            FrameworkElement element = e.OriginalSource as FrameworkElement;
            var transform = element.TransformToVisual(scrollViewer);
            var positionInScrollViewer = transform.Transform(new Point(0, 0));

            //Scrolls the viewer down far enough to see this control + the control directly below it.
            if (positionInScrollViewer.Y < 0 ||
                positionInScrollViewer.Y + SCROLL_PADDING > scrollViewer.ViewportHeight)
            {
               scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset +
                    positionInScrollViewer.Y - SCROLL_PADDING);
            }


        }

这将滚动ScrollViewer超过整个复合控件,但前提是复合控件的顶部关闭或几乎关闭屏幕。