我有一个复合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}},只有上半部分。
我可以设置一些属性,以便自动滚动显示整个控件,而不仅仅是上半部分吗?
答案 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超过整个复合控件,但前提是复合控件的顶部关闭或几乎关闭屏幕。