尝试设置 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% 大小的结果?
与列表视图相比,您仍然最好使用数据网格。
当您设置 horizontalalignment 时,控件将具有自动宽度。
因此您计算大小,控件调整并更改其大小,从而再次触发控件。进入自我传播的死亡螺旋。
尝试删除这两行:
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>
我得到了 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% 大小的结果?
与列表视图相比,您仍然最好使用数据网格。
当您设置 horizontalalignment 时,控件将具有自动宽度。
因此您计算大小,控件调整并更改其大小,从而再次触发控件。进入自我传播的死亡螺旋。
尝试删除这两行:
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>