gpt4 book ai didi

c# - Scrollviewer 中的 WPF 组合框不起作用

转载 作者:行者123 更新时间:2023-11-30 16:49:54 25 4
gpt4 key购买 nike

我对 telerik Combobox 有问题,它也可以为基本的 WPF 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;

}

这个解决方案有效,组合框被移动到 View 的顶部,但我有一个奇怪的行为。组合框“内容”保留在原始位置,并且不会根据组合框的新位置进行更新。这是图片: enter image description here

根据 Telerik 管理员 ( old post ) 的说法,这是一个 WPF 问题,但它必须是一个解决方法,不是吗?任何想法都是有用的!

谢谢!

最佳答案

在滚动查看器中,订阅 ScrollChanged 事件:

ScrollChanged="KeyboardScrollView_OnScrollChanged"

并且在代码隐藏中,如果滚动发生时下拉菜单是打开的,则将其关闭并重新打开:

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

关于c# - Scrollviewer 中的 WPF 组合框不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35793412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com