为了账号安全,请及时绑定邮箱和手机立即绑定

将文本属性设置为大字符串时,WPF 文本框元素会冻结

将文本属性设置为大字符串时,WPF 文本框元素会冻结

C#
暮色呼如 2021-11-21 18:12:47
我目前正在开发一个 UWP 应用程序,我遇到了 TextBox WPF 元素的问题,它在处理较大的文本时似乎性能很差。将剪贴板中的大文本粘贴到文本框中效果很好,但是当我尝试以编程方式设置文本时,它会冻结整个应用程序:textbox.Text = sb.ToString(); //Freezes or takes for ever这就是我在 MainPage.xaml 中定义文本框的方式:<TextBox x:Name="textbox" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ScrollViewer.VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" Margin="0,0,0,70"/>有没有人知道这个性能问题的解决方案,或者有没有我可以使用的替代文本字段元素?
查看完整描述

1 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

好的...我已经能够获得添加文本所需的时间,最多需要 133 毫秒,这是我发现的最高时间。这是一个轻微的抖动;如果我添加 50K 个字符,则需要大约 1000 毫秒,这很明显,但考虑到字符数,这并不坏。


为了执行测试,我首先创建了一个视图: ProgressBar检测 UI 冻结/抖动。 TextBlock以毫秒为单位显示添加文本所需的时间。 Button开始添加文本。 TextBox将文本添加到。


主页.xaml


<Page x:Class="Question_Answer_UWPApp.MainPage"

      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

      mc:Ignorable="d">


    <StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">


        <ProgressBar Name="progressBarAddingText"

                     IsIndeterminate="True" />


        <TextBlock Name="textBlockAddingTextTime" />


        <Button Content="Add Text"

                Click="ButtonClick" />


        <TextBox Name="textBoxAddingText"

                 HorizontalAlignment="Stretch"

                 VerticalAlignment="Stretch"

                 ScrollViewer.VerticalScrollBarVisibility="Auto"

                 TextWrapping="Wrap"

                 Margin="0,0,0,70" />


    </StackPanel>

</Page>

主页.xaml.cs


using System.Diagnostics;

using System.Text;

using System.Threading.Tasks;

using Windows.UI.Xaml.Controls;


namespace Question_Answer_UWPApp

{

    public sealed partial class MainPage : Page

    {

        public static Stopwatch stopwatch = new Stopwatch();

        public MainPage()

        {

            InitializeComponent();

        }


        public async void AddTextAsynchronously()

        { 

            var text = await Task.Run(() =>

            {

                var stringBuilder = new StringBuilder();


                for (int i = 0; i < 5000; i++)

                    stringBuilder.Append("X");


                return stringBuilder.ToString();

            });


            stopwatch.Start();


            textBoxAddingText.Text = text;


            stopwatch.Stop();

            textBlockAddingTextTime.Text = $"{stopwatch.ElapsedMilliseconds.ToString()} milliseconds";

        }


        private void ButtonClick(object sender, Windows.UI.Xaml.RoutedEventArgs e)

        {

            AddTextAsynchronously();

        }

    }

}

在这个测试中,我得到了大约 133 毫秒,但是当我放置StringBuilder外部Task并使用Taskjust 来构建StringBuilder(基本上让我说它.Text = stringBuilder.ToString()需要大约 10 毫秒。这意味着这StringBuilder不是瓶颈。我不相信将文本添加到TextBox也是您的瓶颈。


通过这个测试,我觉得你应该在其他地方寻找你的瓶颈。这应该可以安全地回答向TextBoxvia 代码添加文本并不耗时的问题。


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 221 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信