none
问个以前的问题,关于TextBox大数据量的问题 RRS feed

  • 问题

  • <Window x:Class="GetClockMMImage.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
        <Grid>
            
            <ScrollViewer VerticalScrollBarVisibility="Auto">
                <TextBox Name="tb"  Loaded="tb_Loaded" />
            </ScrollViewer>
        </Grid>
    </Window>
    
    这是前台代码
    
    <pre lang="x-c#"> public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }
    
            string url = "http://d.mmclock.cn/gg/pics/";  //mmclock     图片格式都是 0000.jpg
            string bigimageurl = "http://d.mmclock.cn/pics/"; // mmclock网页版的 大图片
            string url2 = "http://www.clockm.com/tw/widget/img/clk2/hour/";  // 美女克拉克
            string url3 = "http://www.bijint.com/m/img/clk/";        // bijin-tokei
            string bigimageurl3 = "http://www.bijint.com/jp/tokei_images/"; // bijin-tokei大图但和小图不是一张
            string hz = ".jpg";
    
            private void tb_Loaded(object sender, RoutedEventArgs e)
            {
                StringBuilder tmp = new StringBuilder();
                for (int i = 0; i < 24; i++)
                {
                    for (int j = 0; j < 60; j++)
                    {
                        tmp.Append(url3);
                        tmp.Append(i.ToString("00"));
                        tmp.Append(j.ToString("00"));
                        tmp.Append(hz);
                        tmp.Append("\r\n");
                    }
                }
                tb.Text = tmp.ToString();
            }
        }
    
    这是后台代码<br/>. 生成的 TextBox里的 数据有 1440行  当我在 TextBox里全选的时候(CTRL+A) UI就会卡死 好久...大约5,6秒左右 想知道这是什么原因造成的  如何解决
    

    Everyone Is NO.1
    2011年12月14日 8:43

答案

  • MakubeXSoft的代码在全选的时候是很卡,但在滚动上没有明显的卡。

    主要是因为在选择的时候,TextBox控件内部要不断的改变SelectedText这个属性,而且他是通过TextBox的内部的一个 TextRangeBase 类型的Select方法进行复杂位置计算和验证来确定选中内容的。

    研究了一下,当我们把TextBox设为只读的,在选中时就可以忽略很多关于交互时需要的属性值和一些区域计算,性能会非常好。你试一下:

    IsReadOnly="True"
    

    不知道只读是否能够满足你的要求。

    Sincerely,

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 MakubeXSoft 2011年12月16日 2:31
    2011年12月15日 9:36
    版主

全部回复

  • 1440 行还算大量啊?一般 TextBox 放上十万行以上才能算大量。这个慢是肯定的啦。因为你用了 ScrollViewer,所以没有虚拟化支持,当然会很慢了。正确做法如下:

    <Grid>
        <TextBox AcceptsReturn="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" />
    </Grid>

    或:

    <Grid>
        <TextBox AcceptsReturn="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" />
    </Grid>

    上面一种性能会更好,下面一种更美观。


    你这个方法当年就试过. 也不是 ScrollViewer的事  不知道你有没有试过自己的代码.  1440行不多我只是说下数据量
    Everyone Is NO.1
    2011年12月14日 9:40
  • 我当然是先试过才回复的。不信你把 ScrollViewer 去掉试一下吗。我绝对不会不进行对比测试就不负责任的回复

    我也试过,完全不行,还是卡

     


    Everyone Is NO.1
    2011年12月14日 10:25
  • MakubeXSoft的代码在全选的时候是很卡,但在滚动上没有明显的卡。

    主要是因为在选择的时候,TextBox控件内部要不断的改变SelectedText这个属性,而且他是通过TextBox的内部的一个 TextRangeBase 类型的Select方法进行复杂位置计算和验证来确定选中内容的。

    研究了一下,当我们把TextBox设为只读的,在选中时就可以忽略很多关于交互时需要的属性值和一些区域计算,性能会非常好。你试一下:

    IsReadOnly="True"
    

    不知道只读是否能够满足你的要求。

    Sincerely,

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 MakubeXSoft 2011年12月16日 2:31
    2011年12月15日 9:36
    版主
  • MakubeXSoft的代码在全选的时候是很卡,但在滚动上没有明显的卡。

    主要是因为在选择的时候,TextBox控件内部要不断的改变SelectedText这个属性,而且他是通过TextBox的内部的一个 TextRangeBase 类型的Select方法进行复杂位置计算和验证来确定选中内容的。

    研究了一下,当我们把TextBox设为只读的,在选中时就可以忽略很多关于交互时需要的属性值和一些区域计算,性能会非常好。你试一下:

    IsReadOnly="True"
    

    不知道只读是否能够满足你的要求。

    Sincerely,

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    ..  确实好不少.  但还是有点顿卡.   这个是以前发现的问题. 只是前几天突然翻出来所以发上来问问看看有没人知道

    Everyone Is NO.1
    2011年12月16日 2:33