Исключение при попытке установить ширину GridViewColumn - PullRequest
0 голосов
/ 22 мая 2019

Я получил ListView:

<ListView Grid.Row="4" Grid.Column="1" 
              ItemsSource="{Binding Path=ListViewAgentItems, Mode=TwoWay}" 
              HorizontalAlignment="Left" 
              HorizontalContentAlignment="Left"
              SizeChanged="ListView_SizeChanged">
        <ListView.View>
            <GridView>
                <GridViewColumn HeaderContainerStyle="{StaticResource ListViewStyle}" Header="Agent ID" DisplayMemberBinding="{Binding AgentId}"/>
                <GridViewColumn HeaderContainerStyle="{StaticResource ListViewStyle}" Header="Distance" DisplayMemberBinding="{Binding Distance}"/>
            </GridView>
        </ListView.View>
    </ListView>

Я хочу, чтобы GridViewColumn взял 50% ширины всего GridView вместо поведения по умолчанию, в котором столбцы соответствуют их ширине длясодержание.Конечно, сам ListView должен также принимать всю ширину столбца, в котором он находится.

Итак, я добавил это SizeChanged событие:

private void ListView_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        ListView listView = sender as ListView;
        GridView gView = listView.View as GridView;

        var workingWidth = listView.ActualWidth - SystemParameters.VerticalScrollBarWidth; // take into account vertical scrollbar
        var col1 = 0.5;
        var col2 = 0.5;
        gView.Columns[0].Width = workingWidth * col1;
        gView.Columns[1].Width = workingWidth * col2;
    }

Что происходит, так этособытие продолжает вызываться, и значение workingWidth продолжает уменьшаться и уменьшаться, пока не достигнет отрицательного значения, и в этом случае я получаю исключение, потому что отрицательное значение не может быть установлено для свойства width.Как я могу решить эту проблему и получить желаемый результат размером 50% для каждого столбца?

1 Ответ

1 голос
/ 22 мая 2019

Вам все же лучше использовать сетку данных, чем просмотр списка.

Когда вы устанавливаете горизонтальное выравнивание, элемент управления будет иметь автоматическую ширину.

Следовательно, вы вычисляете размер, элемент управления корректируется иэто меняет его размер, что снова запускает управление.В самораспространяющуюся спираль смерти.

Попробуйте удалить эти две строки:

          HorizontalAlignment="Left" 
          HorizontalContentAlignment="Left"

Возможно, вам лучше справиться с изменением размера окна, чем с просмотром списка.

Это примернокак будет выглядеть сетка данных:

    <DataGrid
        AutoGenerateColumns="False"
        ItemsSource="{Binding Path=ListViewAgentItems}" 
          >
        <DataGrid.Columns>
            <DataGridTextColumn 
                 Width="*"
                 Header="Agent ID" 
                 Binding="{Binding AgentId}"/>
            <DataGridTextColumn 
                Width="*"
                Header="Distance"
                Binding="{Binding Distance}"/>
        </DataGrid.Columns>
    </DataGrid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...