网格内部的 WPF 边框列跨度导致 UI 冻结,为什么?
WPF Border column span inside of grid causes UI freeze, why?
由于边框跨越两列,我遇到了数据绑定速度慢的问题,但我不明白为什么。如果我将边框更改为仅驻留在第一列中,则数据网格数据绑定几乎是即时的。请在下面查看我的代码。
这与网格中的第二个列宽设置为*有关,因为当我将其更改为“自动”时它会正常工作,但我希望第二个数据网格填充其余的空白space(我在另一个视图的 TabControl 中使用这个 UserControl)
<UserControl>
<Grid Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="2"
Background="DarkGray">
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Left">
<Button x:Name="LoadDataBttn"
Content="Load Data"
Width="125"
Height="Auto"
Margin="1,0"
Command="{Binding LoadDataCommand}"/>
<Button Content="Clear Data"
Width="125"
Height="Auto"
Margin="1,0"/>
<Button x:Name="ExportToXMLBttn"
Content="Export To XML"
Width="125"
Height="Auto"
Margin="1,0"/>
</StackPanel>
</Border>
<Grid Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="1">
<DataGrid x:Name="DataGrid1"
ItemsSource="{Binding ICollectionProperty}"
SelectedItem="{Binding SelectedItem}"
AutoGenerateColumns="True"
CanUserAddRows="False"
CanUserDeleteRows="False"
Background="Transparent">
</DataGrid>
</Grid>
<Grid Grid.Row="1"
Grid.Column="1">
<DataGrid ItemsSource="{Binding ICollectionProperty2}}"
AutoGenerateColumns="True"
CanUserAddRows="False"
CanUserDeleteRows="False"
Background="Transparent"
Style="{StaticResource AzureDataGrid}">
</DataGrid>
</Grid>
</Grid>
我一直讨厌 "column span" 属性,但有时您只是需要使用它。
在我看来,你应该将你的内容分成更多的网格,同时也是为了元素的清晰分离。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Border Grid.Row="1">...</Border>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<DataGrid Grid.Column="0">...
<DataGrid Grid.Column="1">...
</Grid>
</Grid>
也许列跨度是问题所在...我不知道。试试。
由于边框跨越两列,我遇到了数据绑定速度慢的问题,但我不明白为什么。如果我将边框更改为仅驻留在第一列中,则数据网格数据绑定几乎是即时的。请在下面查看我的代码。
这与网格中的第二个列宽设置为*有关,因为当我将其更改为“自动”时它会正常工作,但我希望第二个数据网格填充其余的空白space(我在另一个视图的 TabControl 中使用这个 UserControl)
<UserControl>
<Grid Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="2"
Background="DarkGray">
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Left">
<Button x:Name="LoadDataBttn"
Content="Load Data"
Width="125"
Height="Auto"
Margin="1,0"
Command="{Binding LoadDataCommand}"/>
<Button Content="Clear Data"
Width="125"
Height="Auto"
Margin="1,0"/>
<Button x:Name="ExportToXMLBttn"
Content="Export To XML"
Width="125"
Height="Auto"
Margin="1,0"/>
</StackPanel>
</Border>
<Grid Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="1">
<DataGrid x:Name="DataGrid1"
ItemsSource="{Binding ICollectionProperty}"
SelectedItem="{Binding SelectedItem}"
AutoGenerateColumns="True"
CanUserAddRows="False"
CanUserDeleteRows="False"
Background="Transparent">
</DataGrid>
</Grid>
<Grid Grid.Row="1"
Grid.Column="1">
<DataGrid ItemsSource="{Binding ICollectionProperty2}}"
AutoGenerateColumns="True"
CanUserAddRows="False"
CanUserDeleteRows="False"
Background="Transparent"
Style="{StaticResource AzureDataGrid}">
</DataGrid>
</Grid>
</Grid>
我一直讨厌 "column span" 属性,但有时您只是需要使用它。 在我看来,你应该将你的内容分成更多的网格,同时也是为了元素的清晰分离。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Border Grid.Row="1">...</Border>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<DataGrid Grid.Column="0">...
<DataGrid Grid.Column="1">...
</Grid>
</Grid>
也许列跨度是问题所在...我不知道。试试。