C# UWP组合框项目会毫无原因地滚动到mid
我注意到,在一个附加了一些itemsource的组合框中,当没有选中的项目时,它倾向于滚动到项目的中间,而不是从顶部(第一个项目)开始,当选中一个项目时,它有时会滚动到选中的项目 所以我想在没有选择任何项目时滚动到第一个项目。为此,我尝试了以下修复 代码 WinRTXamlToolkit.Controls.Extensions为我提供了获取scrollviewer的选项,然后尝试ChangeView方法,但这不起作用。我成功地从列表中获取了第一项,并使用了ContainerFromItem方法,但它返回了null。因此,我也尝试了ContainerFromIndex方法,并将索引设置为0,因为这应该是第一项,但也不起作用 对于所选项(else语句),它可以与C# UWP组合框项目会毫无原因地滚动到mid,c#,xaml,uwp,combobox,scrollviewer,C#,Xaml,Uwp,Combobox,Scrollviewer,我注意到,在一个附加了一些itemsource的组合框中,当没有选中的项目时,它倾向于滚动到项目的中间,而不是从顶部(第一个项目)开始,当选中一个项目时,它有时会滚动到选中的项目 所以我想在没有选择任何项目时滚动到第一个项目。为此,我尝试了以下修复 代码 WinRTXamlToolkit.Controls.Extensions为我提供了获取scrollviewer的选项,然后尝试ChangeView方法,但这不起作用。我成功地从列表中获取了第一项,并使用了ContainerFromItem方法,
ContainerFromIndex(comboBox.SelectedIndex)
配合使用,但只是为了测试,当我尝试使用ContainerFromItem时,它返回空值
仅供参考,此事件属于combobox样式的附加行为,但这并不重要,因为behavor在所选项目场景中工作正常。如果您想在没有所选项目时滚动到第一个项目,您需要更改组合框的
下拉菜单
的行为,而不是组合框的ScrollViewer
组合框的下拉列表
实际上是一个弹出窗口
,显示弹出窗口
的位置在后面的代码中定义,我们无法访问它。一种解决方法是查找弹出窗口
,并在其打开时重新定位它,但使用此方法,我们需要在每次打开时计算垂直偏移量
属性,并且对于垂直偏移量
的不同值,有很多场景
因此,我们建议您自定义一个控件,其行为类似于组合框
,并在未选择任何项时定位到第一项。例如:
创建一个用户控件
:
<Button x:Name="rootButton" BorderBrush="Gray" BorderThickness="2" Click="Button_Click" MinWidth="80" Background="Transparent" Padding="0">
<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
Width="{Binding ElementName=rootButton, Path=ActualWidth}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="32" />
</Grid.ColumnDefinitions>
<TextBlock Text="{x:Bind selectedItem, Mode=OneWay}" Grid.Column="0" VerticalAlignment="Center" FontSize="15" HorizontalAlignment="Center" />
<FontIcon Grid.Column="1" FontSize="12" FontFamily="Segoe MDL2 Assets" Glyph="" HorizontalAlignment="Right"
Margin="0,10,10,10" VerticalAlignment="Center" />
</Grid>
<FlyoutBase.AttachedFlyout>
<MenuFlyout Placement="Bottom" x:Name="menuFlyout">
<MenuFlyoutItem Text="Item 1" Click="MenuFlyoutItem_Click" />
<MenuFlyoutItem Text="Item 2" Click="MenuFlyoutItem_Click" />
<MenuFlyoutItem Text="Item 3" Click="MenuFlyoutItem_Click" />
<MenuFlyoutItem Text="Item 4" Click="MenuFlyoutItem_Click" />
<MenuFlyoutItem Text="Item 5" Click="MenuFlyoutItem_Click" />
</MenuFlyout>
</FlyoutBase.AttachedFlyout>
您可以在其他页面中使用CustomComboBox
,如下所示:
<local:CustomComboBox VerticalAlignment="Center" HorizontalAlignment="Center" />
调用ChangeView
方法,在使用ComboBoxKeyboardSelectionBehavior\u下拉菜单中的Task.Delay()
事件处理程序初始化项目后更改位置:
等待任务。延迟(50);
comboBox.InternalScrollViewer.ChangeView(0,0,1);
注意,在XAML中使用TestComboBox
而不是ComboBox
?如果不解决,,请随时与我们联系。我希望在样式和行为中找到一个解决方案,这样我们就不需要制作自定义控件,因为我们有大量的组合框,制作自定义控件可能不是我们场景中的最佳主意。我们已经有了一个组合框样式,我们在xaml中做了很多自定义内容以及一些行为附件。我更新了答案,您可以检查新的解决方法是否可以解决您的问题。
public sealed partial class CustomComboBox : UserControl, INotifyPropertyChanged
{
public CustomComboBox()
{
this.InitializeComponent();
selectedItem = "";
}
private string _selectedItem;
public string selectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("selectedItem"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void MenuFlyoutItem_Click(object sender, RoutedEventArgs e)
{
var item = sender as MenuFlyoutItem;
selectedItem = item.Text;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
FlyoutBase.ShowAttachedFlyout(sender as Button);
}
}
<local:CustomComboBox VerticalAlignment="Center" HorizontalAlignment="Center" />