自定义RichTextBox控件

时间:2012-07-04 08:30:39

标签: c# silverlight windows-phone-7 silverlight-4.0

在我的Windows Phone应用程序中,我使用RichTextBox控件。我有很长的文本,因此标准控件只显示其中的一部分。

在互联网上,我找到了这个解决方案:Creating-scrollable-Textblock-for-WP7 - 这可以帮助我。它分隔块并为每个文本块创建一个TextBlock。但是我如何为RichTextBox执行此操作?是否可能,因为在我的情况下RichTextBox包含很多块?

1 个答案:

答案 0 :(得分:3)

您可以通过在stackpanel或scrollviewer中添加多个RichTextBox控件来解决此问题。您需要在添加每个文本块时计算RichTextBox的大小。当尺寸似乎超过2048像素的高度/宽度时,您需要在新的Rich Textblock中添加文本。

找到以相同方式实现的TextBlock的以下示例代码。

第1步:

<pre>
<ScrollViewer Margin="10,0,0,70">              
<StackPanel Grid.Row="4" Margin="0,-36,12,12" x:Name="textBlockStackPanel">

<TextBlock x:Name="StorytextBlock" Margin="0,0,12,12" MaxHeight="2048" TextWrapping="Wrap" FontSize="24" TextTrimming="WordEllipsis"  FontFamily="Segoe WP" d:LayoutOverrides="Width"   Foreground="#FF464646"  />

</StackPanel>                       
</ScrollViewer>
</pre>

第2步:

在加载页面时调用ProcessTextLength()方法。

 private void ProcessTextLength(string story)
        {
            string storytext = story.Replace("\n\n", "\n\n^");
            List storylist = storytext.Split('^').ToList();
            List finalstorylist = new List();
            string currenttext = "";
            foreach (var item in storylist)
            {
                currenttext = this.StorytextBlock.Text;
                this.StorytextBlock.Text = this.StorytextBlock.Text + item;
                if(this.StorytextBlock.ActualHeight > 2048)
                {
                    finalstorylist.Add(currenttext);
                    this.StorytextBlock.Text = item;
                }
                if (storylist.IndexOf(item) == storylist.Count - 1)
                {
                    finalstorylist.Add(this.StorytextBlock.Text);
                }
            }
            this.StorytextBlock.Text = "";
            foreach (var finalitem in finalstorylist)
            {
                string text = finalitem;
                if (text.StartsWith("\n\n"))
                    text = text.Substring(2);
                if (text.EndsWith("\n\n"))
                    text = text.Remove(text.Length - 2);
                this.textBlockStackPanel.Children.Add(new TextBlock
                                                          {
                                                              MaxHeight = 2048,
                                                              TextWrapping = TextWrapping.Wrap,
                                                              FontSize = 24,
                                                              TextTrimming = TextTrimming.WordEllipsis,
                                                              FontFamily = new FontFamily("Segoe WP"),
                                                              Text = text,
                                                              Foreground = new SolidColorBrush(Color.FromArgb(255,70,70,70))                                                             
                                                          });                
            }       
        }

这将解决您的问题。如果这对你有帮助,请标记为答案。

由于 哈拉。