代码之家  ›  专栏  ›  技术社区  ›  tayabuz

按下“AddLexemesFromFolder”按钮后网格变小

  •  0
  • tayabuz  · 技术社区  · 8 年前

    我开发一个页面的应用程序。这是主页的XAML

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Vertical" Grid.Row="0">
            <AppBar x:Name="MenuAppBar" IsOpen="True">
                <StackPanel Orientation="Horizontal">
                    <AppBarButton Icon="Add" Label="Добавить лексемы" Name="AddLexemesFromFolder" Click="OpenFolderAndGetLexemes_Click" HorizontalAlignment="Left"/>
                    <AppBarButton Icon="Save" Label="Сохранить лексемы" Name="SaveLexemes" Click="SaveLexemes_Click" HorizontalAlignment="Left"/>
                </StackPanel>
            </AppBar>
        </StackPanel>
        <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" VerticalScrollMode="Enabled">
            <Grid x:Name="GridLexemesViewer" HorizontalAlignment="Stretch"/>
        </ScrollViewer>
    </Grid>
    

    这是OpenFolderAndGetLexemes代码

     private async void OpenFolderAndGetLexemes_Click(object sender, RoutedEventArgs routedEventArgs)
        {
            await StartSaveLexemes();
            var folderPicker = new Windows.Storage.Pickers.FolderPicker();
            folderPicker.FileTypeFilter.Add("*");
            Windows.Storage.StorageFolder folder = await folderPicker.PickSingleFolderAsync();
            if (folder != null)
            {
                StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFolderToken", folder);
                await Task.Run(() => StartNewSessionForGetLexemes(folder.Path));
                InitializeGrid();
            }
        }
    

    我使用“InitializeGrid”方法清除GridLexemesViewer中的子级,使用CreateRowsAndColumns并将包含内容的TextBox放入GridLexemesViewer。 这是InitializeGrid和CreateRowsAndColumns()的代码

    private void InitializeGrid()
        {
            GridLexemesViewer.Children.Clear();
            CreateRowsAndColumns();
            int index = 1;
            foreach (var lexem in CurrentSession.Lexemes)
            {
                foreach (var item in lexem.Value)
                {
                    Binding binding = new Binding
                    {
                        Source = item,
                        Path = new PropertyPath("Value"),
                        Mode = BindingMode.TwoWay,
                        UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
                    };
                    TextBox textBox = new TextBox { TextWrapping = TextWrapping.Wrap };
                    BindingOperations.SetBinding(textBox, TextBox.TextProperty, binding);
                    GridLexemesViewer.Children.Add(textBox);
                    Grid.SetColumn(textBox, CurrentSession.Languages.IndexOf(item.Language) + 1);
                    Grid.SetRow(textBox, index);
                }
                index++;
            }
    
        }
    
        private void CreateRowsAndColumns()
        {
            int indexRow = 1;
            int indexColumn = 1;
            RowDefinition firstRowDefinition = new RowDefinition();
            ColumnDefinition firstColumnDefinition = new ColumnDefinition { Width = GridLength.Auto };
            GridLexemesViewer.ColumnDefinitions.Add(firstColumnDefinition);
            GridLexemesViewer.RowDefinitions.Add(firstRowDefinition);
            foreach (var key in CurrentSession.Lexemes.Keys)
            {
                RowDefinition rowDefinition = new RowDefinition();
                GridLexemesViewer.RowDefinitions.Add(rowDefinition);
                TextBlock textBlock = new TextBlock{Text = key};
                GridLexemesViewer.Children.Add(textBlock);
                Grid.SetRow(textBlock, indexRow);
                indexRow++;
            }
            foreach (var language in CurrentSession.Languages)
            {
                ColumnDefinition columnDefinition = new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star)};
                GridLexemesViewer.ColumnDefinitions.Add(columnDefinition);
                TextBlock textBlock = new TextBlock {Text = language};
                GridLexemesViewer.Children.Add(textBlock);
                Grid.SetRow(textBlock, 0);
                Grid.SetColumn(textBlock, indexColumn);
                indexColumn++;
            }
        }
    

    这个GIF展示了如何重现bug Reproduction of bug

    1 回复  |  直到 8 年前
        1
  •  1
  •   Martin Zikmund    8 年前

    问题是你在打电话 CreateRowsAndColumns() 每次,但不移除 Rows Columns 从上一次运行。使用 Grid.Clear() Grid ,但是 Grid.RowDefinitions 和 Grid.ColumnDefinitions 保持完整。

    要解决此问题,请在开始时清除这两个定义 CreateRowsAndColumns() :

    GridLexemesViewer.RowDefinitions.Clear();
    GridLexemesViewer.ColumnDefinitions.Clear();
    

    但是,一定要考虑使用 DataGrid control 从Windows社区工具包,因为它应该有你需要的所有功能,并有更好的可维护性和性能,然后自定义 ,尤其是对于更大的数据。