Сетка становится меньше после нажатия кнопки «AddLexemesFromFolder» - PullRequest
0 голосов
/ 16 сентября 2018

Я разрабатываю одностраничное приложение. Это XAML MainPage

<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();
        }
    }

Я использую метод InitializeGrid для очистки Children в 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 показывает, как воспроизвести ошибку Reproduction of bug

1 Ответ

0 голосов
/ 17 сентября 2018

Проблема в том, что вы звоните CreateRowsAndColumns() каждый раз, но не удаляете Rows и Columns из предыдущего запуска. Использование Grid.Clear() удаляет только дочерние элементы управления в Grid, но Grid.RowDefinitions и Grid.ColumnDefinitions остаются неизменными.

Чтобы исправить это, очистите оба определения в начале CreateRowsAndColumns():

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

Тем не менее, обязательно рассмотрите возможность использования DataGrid элемента управления из набора инструментов сообщества Windows, поскольку он должен иметь все необходимые функции и иметь лучшую поддержку и производительность, чем пользовательский Grid, особенно для больших данных. .

...