- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个日志页面,在应用程序运行时添加日志。需要的一项功能是能够自动滚动到最新(最后)添加的日志。
问题是,当我在 observablecollection 上使用 scrollto 函数时,日志页面似乎重新加载了整个列表。
这不是问题,但是当列表足够大时,它会导致页面在重绘列表时闪烁。
有没有向页面添加日志语句并滚动到页面的最后一个元素而不导致页面闪烁的方法。
我真的愿意接受任何解决方案,但它必须满足以下要求:
能够在创建/添加日志时实时刷新(这很频繁)
能够自动滚动到页面末尾。
能够干净地刷新(没有闪烁或其他类型的问题)。
我的尝试:
我尝试了两种不同的方法来实现它。
第一种方法是将“logstatement”(字符串)标签添加到内容页。然后我会使用 lastorDefault() 方法找到布局中的最后一个 child (在本例中为 stacklayout)然后滚动到该项目(在本例中为 Label())。
我必须使用 Device.BeginInvokeOnMainThread 将标签添加到主线程(否则它会与程序的其他方面发生冲突)这会导致滚动函数和此调用之间出现竞争条件,最终会在列表为足够大。这种方式的第二个问题是,当页面变得足够大并且我们正在添加语句时,它也会出现闪烁问题。
我尝试实现它的第二种方法是使用一个可观察集合,我在其中向可观察集合添加标签并使用一个数据模板来访问标签的文本和文本颜色。添加标签后,我使用 scrollto 函数滚动到列表底部。当列表很小(少于 150 个左右)时,此方法工作正常,但随后在添加标签(日志语句)时页面会闪烁。
我目前的想法是在可观察集合中只包含最后 50 个左右的项目,这样刷新就干净了我正在寻找更好的解决方案,但也许不存在。
我对显示的代码进行了大量修改,因此其中一些代码没有意义,但我尽量保持这里的逻辑纯正。
我现在无法添加可编译代码,但如果此代码不足,我会创建一个测试项目,请告诉我。
代码:
public LoggingPage()
{
InitializeComponent();
loggingPage.ItemAppearing += EnableAutoScroll;
DisplayLogsOnScreen(logstatements);
}
//adds the logs to the screen
private void DisplayLogsOnScreen(LogStatement logstatements)
{
Label loggingLabel = new Label();
foreach (typeOfLog tempLogType in differentlogTypes)
{
switch (tempLogType)
{
case typeOfLog.FIRSTTYPE:
Device.BeginInvokeOnMainThread(() => {
logObservableCollection.Add(loggingLabel);
});
break;
case LogType.SECONDTYPE:
Device.BeginInvokeOnMainThread(() => {
differentLogObservableCollection.Add(loggingLabel);
});
break;
default:
break;
}
}
}
// have to wrap the scrollto events in an itemAppeared event handler
// otherwise the update to the UI is laggy
// it still has issues updating the logview this workaround is not perfect
private void AddAutoScroll(object sender, EventArgs e)
{
if (autoScroll)//a button that enables and disables autoscroll
{
logListView.ScrollTo(logObservableCollection.LastOrDefault(), ScrollToPosition.End, true);
logListView.ScrollTo(differentLogObservableCollection.LastOrDefault(), ScrollToPosition.End, true);
}
}
Xaml:
<ContentPage Title="logPage">
<ContentPage.Content>
<ListView x:Name="loggingPage">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Text}" TextColor="{Binding TextColor}"/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage.Content>
</ContentPage>
最佳答案
这里的问题是 ListView 的 ScrollTo() 函数。当我们打电话时:
logListView.ScrollTo(logObservableCollection.LastOrDefault(), ScrollToPosition.End, true);
ScrollTo 函数似乎遍历整个可观察集合以找到列表中的最后一项。
我通过创建一个方法而不是使用这个 onAppearing 事件处理程序来规避这个问题。
这是我更新的代码。请注意,两者都必须在主线程上调用。
if (statementObject.Types.Contains(LogType.diffLogType))
{
Device.BeginInvokeOnMainThread(() => {
_incidentLabelListCollection.Add(logStatement);
if (autoScroll)
EnableAutoScroll(logStatement,null);
});
}
第二种方法
private void EnableAutoScroll(Label label, ListView listView)
{
Device.BeginInvokeOnMainThread(() =>
{
if(logListView.IsVisible)
logListView.ScrollTo(label, ScrollToPosition.End, false);
});
}
关于c# - 无法使用大量项目干净地刷新 xaml 内容页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51865568/
我想创建一个包含一堆其他 XAML 文件的主 XAML 文件。这可能吗? 最佳答案 在您的主 Xaml 中,使用 项目控件 balise 和 Xaml 组合器,您必须使用 定义您的项目用户控件 代替
如何在 xaml 中更改 ToggleSwitch 中实际开关的大小?我可以更改 OnContent 和 OffContent 的文本大小,但滑动开关永远不会更改大小。 这些都不会改变开关本身的大小,
我有一个文本 block 列表,其中可能包括里面的 url,比如: 构建失败,请在此处查看更多信息:http://... 构建成功 应用 http://myapp/无法启动,请在此处查看更多信息:ht
我想做的事 我最近一直在探索 XAML 资源字典。它们非常强大,但为了减少(甚至进一步)为适应任何修改而需要进行的更改,我想使用一些基本的算术运算来更改 HeightRequest Entry 的属性
我使用以下代码创建了一个弹出窗口,但我不知道如何将它居中 我试图在运行时自动更改边距,但我不知道该怎么做,但是有人知道如何将弹出窗口居中吗? 它没有标准维度,因为我需要全局化我的程序
哪种类型的命名更适合在 XAML 中使用: xmlns:inventoryControls="clr-namespace:Inventory.Components.Controls;assembly=
我正在尝试格式化我的 string每 3 位有逗号,如果不是整数,则为小数。我检查了大约 20 个示例,这是我最接近的示例: 但我得到一个 The property 'StringFormat' w
在 Windows Phone 8 中,我想将一个图像放在一个圆圈中。是否有类似网格的圆形容器?我知道有椭圆位它不是容器 最佳答案 这是我如何做到的。
有没有办法在 XAML 中检查逻辑非逻辑。我试图绑定(bind)到广泛使用的属性,但是对于这些新的绑定(bind),它的方式是错误的。我不想修改属性,那么有没有办法在 xaml 中反转 bool 结果
在 html 中可以说 width="20%"。这在 XAML 中当然是不允许的。有谁知道为什么会这样或者有没有办法在 XAML 中获得百分比值支持? 最佳答案 网格列定义和行定义允许比例单位(除了固
我可以动态创建 XAML 并将其弹出到我的应用程序中吗?该怎么做呢? 最佳答案 是的,这很简单: XmlReader tXml = XmlReader.Create(myXamlString); UI
简短版: 如果不使用 xamlc 预编译 xaml,应用程序中捆绑了什么以在运行时编译 xaml?它是否取决于 xamarin.forms nugets 之外的应用构建时的当前工具集? 长版: 我们有
我知道如何显示内容页面,但如何根据方向选择正确的布局。我想编写 xaml 文件:一个用于垂直方向,另一个用于水平方向。方向改变时是否可以切换xaml文件 最佳答案 Xamarin.Forms does
我是一名 Android 开发者,我是 Windows Phone 8 的新手 最近我做了一个 android 应用程序..所以我想在 Windows Phone 8 中开发具有相同 View 和相同
在库中编译 XAML 时出现以下错误: Themes\Generic.xaml(35,12): XamlCompiler error WMC0610: XBF generation error cod
我需要在几个不同的 XAML 布局文件中包含一个通用的 XAML。 我不想在其他 XAML 文件中对重复的 XAML 部分进行硬编码。 怎么做包含? 最佳答案 你能把共享代码变成UserControl
我想像这样添加一个符号: 这行不通,所以我尝试用\分隔,但也行不通。有人对我如何做到这一点有任何建议吗? 最佳答案 其实这个问题不是关于XAML的,它只是一个纯XML的问题。 XML中有些字符需要转
我在 Xaml 中定义了这样的列表。 #3599B8 #374649 #FD625E #F2C80F
在向 Microsoft 报告之前,我想在这里问一下。我有一个问题,我无法看到我的 WinUI 3 应用程序的实时可视化树。我什至看不到应用程序内工具栏。我可以在 WPF 和 UWP 应用程序中看到,
我已经定义了一个动画作为一个资源,当通过这样的 EventTrigger 调用时它可以工作: 然后
我是一名优秀的程序员,十分优秀!