按下“ AddLexemesFromFolder”按钮后,网格变得越来越小

时间:2018-09-16 14:57:21

标签: c# uwp grid uwp-xaml

我开发了一页应用程序。这是MainPage的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>

当我多次按下“ AddLexemesFromFolder”按钮时,GridLexemesViewer越来越小。 这是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();
        }
    }

我在GridLexemesViewer中使用“ InitializeGrid”方法来清除子级,使用CreateRowsAndColumns并将带有内容的文本框放入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显示了如何重现错误 Reproduction of bug

1 个答案:

答案 0 :(得分:1)

问题是您每次都调用CreateRowsAndColumns(),但没有从上一次运行中删除RowsColumns。使用Grid.Clear()仅删除Grid中的子控件,但是Grid.RowDefinitionsGrid.ColumnDefinitions保持不变。

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

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

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