尝试设置 GridViewColumn 宽度时出现异常

Exception when trying to set GridViewColumn width

我得到了 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 占据整个 GridView 宽度的 50%,而不是默认行为,即列的宽度适合内容。当然 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的值越来越小,直到达到负值,在这种情况下我得到一个异常,因为负值不能设置为宽度 属性。我怎样才能解决这个问题并得到我想要的每列 50% 大小的结果?

与列表视图相比,您仍然最好使用数据网格。

当您设置 horizo​​ntalalignment 时,控件将具有自动宽度。

因此您计算大小,控件调整并更改其大小,从而再次触发控件。进入自我传播的死亡螺旋。

尝试删除这两行:

          HorizontalAlignment="Left" 
          HorizontalContentAlignment="Left"

您还可以更好地处理 window 大小更改而不是列表视图。

数据网格大致如下所示:

    <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>