我的目标是在 ListBox 中显示最新添加的项目。严格来说,我是通过ListBox
输出控制台来模拟的。 AvaloniaListBox
没有方法ScrollToEnd
,但是它有一个方法ScrollIntoView
,但不幸的是没有效果。我在 GitHub 上找到了一个关于此问题的问题,其中讨论了通过在 UI 线程中运行方法来解决此问题,但这也没有任何效果。我的搜索让我找到了ScrollViewer
具有所需方法的东西ScrollToEnd
,但是在加载表单时我无法加载它。可能是因为当内容不适合视口时它就被隐式地创建了。通过这个我可以弄清楚,但我有一个问题:我做的一切都正确吗,或者有没有更简单的方法?
主页
/
user-577652
Arthur Conan Doyle's questions
我有一个代码,可以使用 SNMP 协议 1-3 通过 SnmpSharp 库扫描网络中选定的 IP,并生成新设备的事件。
// Для каждого адреса
for (int i = 0; i < Params.Ip.Length; i++)
{
// Для каждого диапозона
for (int b = Params.FromByte; b <= Params.ToByte; b++)
{
if (_stop) return;
IPEndPoint ip = new IPEndPoint(IPAddress.Parse($"{Params.Ip[i]}.{b}"), Port);
if (Params.V1)
{
Task t = Task.Run(async () => await GetV1Async(ip));
tasks.Add(t);
}
if (Params.V2)
{
Task t = Task.Run(async () => await GetV2Async(ip));
tasks.Add(t);
}
if (Params.V3)
{
Task t = Task.Run(async () => await GetV3Async(ip));
tasks.Add(t);
}
}
}
await Task.WhenAll(tasks);
该代码速度很慢;对于一个具有两种协议的 IP,它运行大约 25 秒,导致进程速度严重减慢并且窗口冻结。但是当我在 VS2022 中使用异步代码分析器(Alt+F2
-> .NET Async
)时,使用它我的代码运行时间减少了大约 10 倍(~2.5 秒),也就是说,冻结情况本身原则上不会发生,并且在探查器我不能。
该项目本身位于 NET 6、Avalonia 11.0.7 上
如果容器(ListBox
等TreeView
)ItemsSource
接受一组可能属于不同类的元素,我如何为它们创建不同的表示?例如,我有ObservableCollection<Animal>
,但它可能包含类的实例等Cat
。Dog
有人可能拥有臂展的属性,有人可能拥有跳跃的高度,这一切自然不包含在基类中Animal
。
<ListBox ItemsSource="{Binding Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<!-- здесь содержимое должно быть типозависимым -->
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我不明白 ItemTemplate 如何检查类,输出可能因类而异的必填字段。如果 XAML 中有条件块,那么事情会更简单(在我看来)。