Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UWP组合框项目会毫无原因地滚动到mid_C#_Xaml_Uwp_Combobox_Scrollviewer - Fatal编程技术网

C# UWP组合框项目会毫无原因地滚动到mid

C# UWP组合框项目会毫无原因地滚动到mid,c#,xaml,uwp,combobox,scrollviewer,C#,Xaml,Uwp,Combobox,Scrollviewer,我注意到,在一个附加了一些itemsource的组合框中,当没有选中的项目时,它倾向于滚动到项目的中间,而不是从顶部(第一个项目)开始,当选中一个项目时,它有时会滚动到选中的项目 所以我想在没有选择任何项目时滚动到第一个项目。为此,我尝试了以下修复 代码 WinRTXamlToolkit.Controls.Extensions为我提供了获取scrollviewer的选项,然后尝试ChangeView方法,但这不起作用。我成功地从列表中获取了第一项,并使用了ContainerFromItem方法,

我注意到,在一个附加了一些itemsource的组合框中,当没有选中的项目时,它倾向于滚动到项目的中间,而不是从顶部(第一个项目)开始,当选中一个项目时,它有时会滚动到选中的项目

所以我想在没有选择任何项目时滚动到第一个项目。为此,我尝试了以下修复

代码 WinRTXamlToolkit.Controls.Extensions为我提供了获取scrollviewer的选项,然后尝试ChangeView方法,但这不起作用。我成功地从列表中获取了第一项,并使用了ContainerFromItem方法,但它返回了null。因此,我也尝试了ContainerFromIndex方法,并将索引设置为0,因为这应该是第一项,但也不起作用

对于所选项(else语句),它可以与
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="&#xE0E5;" 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" />