【发布时间】:2021-09-14 06:32:12
【问题描述】:
我有一个数据网格,当剩余的记录少于 50 条时,会触发检索后续记录的事件。我在 Task.Run 中开始下载过程。
有一种情况,当用户用鼠标将滚动条滚动到末尾时,程序开始永远下载新记录。 当我通过 Visual Studio 运行程序时,界面没有崩溃,我可以通过向上移动滚动条来中断下载。
但是当通过.exe启动程序时,界面被冻结,无法进行任何操作。
在这种情况下,总是 e.ExtentHeight - e.VerticalOffset == 27。
我尝试在每次调用下载后以某种方式设置滚动条以获得 e.ExtentHeight - e.VerticalOffset> 50。但我不知道如何为 DataGrid 执行此操作我只看到 ScrollIntoView () 但是当我使用它时我没有看到任何变化。
我做了一个测试程序,当.exe启动时出现同样的问题:
public partial class MainWindow : Window
{
public List<Event> EventsList { get; set; }
public MainWindow()
{
InitializeComponent();
EventsList = new List<Event>();
}
private void EventDataGrid_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
Task.Run(() =>
{
if (e.ExtentHeight - 50 < e.VerticalOffset)
TakeEvents();
});
}
Random r = new Random();
int lastIndex = 0;
private void TakeEvents()
{
Stopwatch s = new Stopwatch();
s.Start();
for (int i = 0; i < 900; i++)
{
EventsList.Add(new Event()
{
Device = 1,
Index = lastIndex++
});
}
s.Stop();
RefreshEventsList();
}
private void RefreshEventsList()
{
Task.Run(() =>
{
Dispatcher.Invoke(() =>
{
var filtrList = EventsList.Where(x => x != null && x.Device != 0).ToList();
EventsDataGrid.ItemsSource = filtrList;
});
});
}
}
public class Event
{
public int Index { get; set; }
public int Device { get; set; }
}
XAML:
<Grid>
<DataGrid x:Name="EventsDataGrid" FontSize="15" Grid.Row="1" AutoGenerateColumns="False" ItemsSource="{Binding}" IsReadOnly="True" ScrollViewer.HorizontalScrollBarVisibility="Disabled" VerticalAlignment="Stretch"
Background="Transparent" Foreground="Black" HeadersVisibility="Column" VerticalScrollBarVisibility="Visible" BorderThickness="0" ScrollViewer.ScrollChanged="EventDataGrid_ScrollChanged" >
<DataGrid.Columns>
<DataGridTextColumn Width="*" Binding="{Binding Index}" Header="Index" Foreground="Black"/>
<DataGridTextColumn Width="*" Binding="{Binding Device}" Header="Device" Foreground="Black"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
【问题讨论】:
-
你知道没有
await的async没用吗? - stackoverflow.com/questions/17805887/… -
@RandRandom 是的,我知道,我正在测试一些东西,但不记得删除它