滚动视图中的WPF组合框无法正常工作

3

我在使用Telerik Combobox时遇到了问题,基本的WPF Combobox也会出现相同的情况。

我的场景如下:当用户尝试打开Combobox时,整个页面(包括此控件)应该向上移动,因为底部区域将被键盘占用。

为了实现这一点,我捕获了GotFocus事件,并通过编程方式更新了Scrollviewer的位置。

以下是XAML:

  <ScrollViewer Grid.Row="2" x:Name="KeyBoardScrollViewer" PanningMode="VerticalOnly" VerticalScrollBarVisibility="Hidden">
 <telerik:RadComboBox Grid.Row="5" GotFocus="UIElement_OnGotFocus" LostFocus="UIElement_OnLostFocus"
                                 IsEditable="True"
                                 Grid.Column="1"
                                 ItemsSource="{Binding StreetOthers, Mode=TwoWay}"
                                 Text="{Binding SelectedStreetOthers, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
                                 Height="36" Width="250"
                                 HorizontalAlignment="Left"
                                 VerticalAlignment="Top"
                                 FontSize="18" 
                                 Margin="10 0 0 0"
                                 Padding="5" />
 </ScrollViewer>

并且代码背后是:

  public double RememberedPoisitionOfScrollBar { get; set; }
   private void UIElement_OnGotFocus(object sender, RoutedEventArgs e)
        {

            Application.Current.Dispatcher.InvokeAsync(() =>
            {
                if (!Keyboard.IsOpen)
                {
                    Keyboard.IsOpen = true;
                    KeyBoardScrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
                }
                Point relativePoint = ((FrameworkElement)sender).TransformToAncestor(KeyBoardScrollViewer)
                           .Transform(new Point(0, 0));


                KeyBoardScrollViewer.CanContentScroll = false;
                RememberedPoisitionOfScrollBar = relativePoint.Y - 5;
                var offset = KeyBoardScrollViewer.VerticalOffset + relativePoint.Y - 5; //sender.OccludedRect.Top
                KeyBoardScrollViewer.ScrollToVerticalOffset(offset);
                //KeyBoardScrollViewer.ScrollToVerticalOffset(offset);
                KeyBoardScrollViewer.UpdateLayout();
            });
            Keyboard.Width = this.ActualWidth;


        }

        private void UIElement_OnLostFocus(object sender, RoutedEventArgs e)
        {

                Keyboard.IsOpen = false;
                KeyBoardScrollViewer.ScrollToVerticalOffset(KeyBoardScrollViewer.VerticalOffset - RememberedPoisitionOfScrollBar);
                KeyBoardScrollViewer.UpdateLayout();
                KeyBoardScrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;

        }

这个解决方案有效,下拉框被移动到视图的顶部,但是我遇到了奇怪的问题。下拉框“内容”仍然停留在原来的位置,并且不会根据下拉框的新位置进行更新。这是图片: enter image description here 根据Telerik管理员(旧帖子)的说法,这是一个WPF问题,但必须有一种解决方法,对吗?任何想法都很有用!
谢谢!
1个回答

2
在滚动查看器中,订阅ScrollChanged事件:
ScrollChanged="KeyboardScrollView_OnScrollChanged"

在代码后台,如果下拉菜单在滚动时处于打开状态,则关闭并重新打开它。
private void KeyboardScrollView_OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
  if (TheComboBox.IsDropDownOpen)
  {
    TheComboBox.IsDropDownOpen = false;
    TheComboBox.IsDropDownOpen = true;
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接