2016-03-04 26 views
3

我有一个telerik Combobox的问题,它也可以复制为基本的WPF组合框。WPF组合框内滚动查看器不工作

我有以下情况:当用户试图打开组合框时,整个页面(包括此控件)应该向上移动,因为在底部部分空间将被键盘占用。

为了做到这一点,我抓住了GotFocus事件,我已经以编程方式更新了滚动查看器的位置。

这里是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的管理员(old post)这是一个WPF的问题,但它是一个解决办法,不是吗?任何想法都很有用!

谢谢!

回答

2

在滚动浏览,订阅ScrollChanged事件:

ScrollChanged="KeyboardScrollView_OnScrollChanged" 

,并在代码隐藏,如果下拉列表处于打开状态时滚动出现,将其关闭并重新打开:

private void KeyboardScrollView_OnScrollChanged(object sender, ScrollChangedEventArgs e) 
{ 
    if (TheComboBox.IsDropDownOpen) 
    { 
    TheComboBox.IsDropDownOpen = false; 
    TheComboBox.IsDropDownOpen = true; 
    } 
}