【问题标题】:how many characters can a Silverlight TextBlock hold?Silverlight TextBlock 可以容纳多少个字符?
【发布时间】:2024-04-19 14:55:01
【问题描述】:

我正在尝试将最终用户许可协议 (EULA) 放入 WP7 silverlight 文本块控件中。但是,它一直在截断我的文本。为什么会这样? WP7 silverlight 文本块可以容纳的文本大小或字符数是否有限制?

下面是我在 xaml 方面所做的示例(xaml 周围的其余部分是自动生成的默认设置)。

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <ScrollViewer>
        <TextBlock x:Name="tbMsg" TextWrapping="Wrap"/>
    </ScrollViewer>
</Grid>

我也尝试过使用文本框,但现在,我什至无法在文本框内滚动。我也明确地将 VerticalScrollBarVisibility 设置为 Visible,但我仍然无法向下滚动 TextBox。事实上,我什至没有看到垂直滚动条。我不知道这种观察是否是因为我仍在通过模拟器查看 UI。

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <TextBox x:Name="tbMsg" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible"/>
</Grid>

【问题讨论】:

  • 我认为文本大小或限制没有限制。但是内存可能会受到限制,因此如果您的文件太大(例如超过 10mbs),则可能会导致问题。您还应该尝试将文本块包装在滚动面板中以启用滚动。
  • 我的 eula.txt 文件设置为“内容”和“不复制”。在windows 7上,通过查看其属性,其文件大小为5.95 KB(其在磁盘上的大小不同,显示为8.00 KB)。
  • 在notepad++中查看我的eula.txt,它有69行6093个字符。它以 UTF-8 格式保存。
  • 最后,我不熟悉滚动面板,它是与开箱即用的 wp7 silverlight sdk(即 wp7 工具包中的某处)无关的控件吗?我使用了 ScrollViewer 控件,它似乎在做我想做的事,除了截断。当我将代码放在调试器中并查看我的字符串时,它会被完全读取到最后,只是显示不正确。

标签: windows-phone-7 textblock


【解决方案1】:

UIElement 在任一方向(高度或宽度)上都不能大于 2048 像素。超出此区域显示的任何内容都不会显示。 不过,在可视化树中保留此内容的空间。

解决此问题的方法是使用多个元素来显示大量文本。

更新
我已经编写了自己的解析器来动态显示此类内容。理想情况下,尽管您不会在运行时处理大块文本。当文本包含链接(指向其他页面、Web 内容或电子邮件启动器)时,这可能会更加复杂。

当想要显示 EULA 或任何大段文本时,您不会想让用户轻松阅读和导航。毕竟,您要包含文本,因为您希望用户阅读它。

如果您在设计时有文本,则应借此机会确保其布局合理,并为不同的部分使用单独的 TextBlock,并适当地设置标题和子标题的样式可以帮助您做到这一点。

【讨论】:

  • 你能给我一个关于这种方法的链接吗?
  • @user373312 - 这篇博文不错blogs.msdn.com/b/priozersk/archive/2010/09/08/…
  • @matt 哇,我只能这么说。实现这一点并非易事,正如代码中清楚地展示的那样。感谢您的链接。
  • 我遇到了同样的问题,并决定使用 NavigateToString 将其放置在 WebBrowser 控件中。您可能想尝试一下。
【解决方案2】:

这可能是几件事 - 您的文本块的高度可能受到另一个控件的限制,您应用于文本的样式可能会导致它...

你能发布你的来源吗?

【讨论】:

  • 我已经修改了原帖。
【解决方案3】:

我想和你分享这段代码。它创建了许多 TextBlocks 并作为子项添加到 Stackpanel。您可以在 Scroll 查看器中创建 Stackpanel,因为 Scrollvewers 只能直接获取单个子元素。

    //constructor
    List<char> countStoryvar = new List<char>(); //to store the text Body
    private string incStorybody;
    private int textMax = 2000;    //You can modify this.

   //methods
 private void PlaceData()
    {
        incStorybody = "Your Story Source";
        int countStory = incStorybody.Count();
        countStoryvar = incStorybody.ToList();
        double countStoryd = double.Parse(countStory.ToString());
        if (countStoryd < textMax)
        {
            TextBlock txtBlock = new TextBlock();
            txtBlock.TextWrapping = TextWrapping.Wrap;
            readStackPanel.Children.Add(txtBlock);
        }
        else
        {
            double countStoryd2 = countStoryd / textMax;  //fetch divisions
            countStoryd2 = Math.Round(countStoryd2, 5);  //getting Real no
            string sountstring = countStoryd2.ToString();
            string[] split = sountstring.Split(new string[] { "." }, StringSplitOptions.None);     //to remove decimal
            int countStoryi = int.Parse(split[0]);
            int remainder = countStory - (textMax * countStoryi);
            int iterationtimestin = countStoryi + 1;
            for (int z = 0; z < iterationtimestin; z++)
            {
                int zlast = countStoryi - 1;
                int multiple = 0;
                int multiple1 = 0;
                int multiplecounter = 0;
                multiple = textMax * z;
                if (z == 0)
                {
                    multiplecounter = textMax;
                }
                else
                {
                    if (z == countStoryi)
                    {
                        multiplecounter = countStory;

                    }
                    else
                    {
                        multiple1 = z + 1;
                        multiplecounter = textMax * multiple1;
                    }
                }
                LoadStackPanel(multiple, multiplecounter);
            }
        }

    }
    private void LoadStackPanel(int starting, int ending)
    {
        TextBlock txtBlock = new TextBlock();
        txtBlock.TextWrapping = TextWrapping.Wrap;
        for (int zi = starting; zi < ending; zi++)
        {
            incStoryInput = incStoryInput + countStoryvar[zi];
        }
        txtBlock.Text = incStoryInput;
        readStackPanel.Children.Add(txtBlock);
        incStoryInput = string.Empty;
    }

【讨论】:

    最近更新 更多