سؤال

لدي رمز XAML التالي:

<Window x:Class="RichText_Wrapping.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1">
<Grid>
    <RichTextBox Height="100" Margin="2" Name="richTextBox1">
        <FlowDocument>
            <Paragraph>
                This is a RichTextBox - if you don't specify a width, the text appears in a single column
            </Paragraph>
        </FlowDocument>
    </RichTextBox>
</Grid>

...إذا قمت بإنشاء هذه النافذة في XAML، يمكنك أن ترى أنه عندما لا تحدد عرضًا للنافذة، فإنها تقوم بتغليف النص في عمود واحد، حرفًا واحدًا في كل مرة.هل هناك شيء أفتقده؟إذا كان هناك نقص معروف في التحكم، فهل هناك أي حل بديل؟

هل كانت مفيدة؟

المحلول

وحاول ربط العرض على FlowDocument في (ذهاب) إلى عرض RichTextBox الحاوية.

وعملت بالنسبة لي ...

نصائح أخرى

وهذا خطأ مؤكد مع برنامج الأغذية العالمي RichTextBox. لإصلاحه، ربط PageWidth من FlowDocument لعرض RichTextBox، أي بمعنى.

<RichTextBox Name="rtb">
    <FlowDocument Name="rtbFlowDoc" PageWidth="{Binding ElementName=rtb, Path=ActualWidth}" />
</RichTextBox>

وتحرير: إعطاء FlowDocument اسم بحيث يمكنك الوصول إليه في التعليمات البرمجية خلف وأبدا الجديدة الوثيقة التدفق في codebehind.

النهج في هذا المقال عملت بالنسبة لي:

لا يوفر WPF RichTextBox وظيفة ضبط عرضه إلى النص.بقدر ما أعرف ، يستخدم RichTextBox عرض FlowDocumentView في شجرتها المرئية لتقديم المستند الانسيابي.سوف يستغرق ما هو متاح مساحة لعرض محتواه ، لذلك لن يضبط حجمه على محتوى.نظرا لأن هذه فئة داخلية ، يبدو أنه لا يمكننا تجاوزها عملية التخطيط للسماح ل RichTextBox بضبط حجمه إلى نص.

ولذلك، أعتقد أن النهج الخاص بك هو في الاتجاه الصحيح.لسوء الحظ ، بناء على بحثي ، لا توجد طريقة مباشرة لقياس حجم النص المعروض في RichTextBox.

هناك حل بديل يمكننا تجربته.يمكننا التكرار خلال المستند الانسيابي في RichTextBox بشكل متكرر لاسترداد كافة كائنات التشغيل والفقرة.ثم نقوم بتحويلها إلى FormattedText للحصول على الحجم.

هذا المقال يوضح كيفية تحويل FlowDocument إلى نص منسق.أكتب أيضا عينة بسيطة باستخدام فئة FlowDocumentExtensions في تلك المقالة.

    public Window2()
    {
      InitializeComponent();

      StackPanel layoutRoot = new StackPanel();
      RichTextBox myRichTextBox = new RichTextBox() { Width=20};

      this.Content = layoutRoot;
      layoutRoot.Children.Add(myRichTextBox);

      myRichTextBox.Focus();
      myRichTextBox.TextChanged += new TextChangedEventHandler((o,e)=>myRichTextBox.Width=myRichTextBox.Document.GetFormattedText().WidthIncludingTrailingWhitespace+20);
    }


  public static class FlowDocumentExtensions
  {
    private static IEnumerable<TextElement> GetRunsAndParagraphs(FlowDocument doc)
    {
      for (TextPointer position = doc.ContentStart;
        position != null && position.CompareTo(doc.ContentEnd) <= 0;
        position = position.GetNextContextPosition(LogicalDirection.Forward))
      {
        if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.ElementEnd)
        {
          Run run = position.Parent as Run;

          if (run != null)
          {
            yield return run;
          }
          else
          {
            Paragraph para = position.Parent as Paragraph;

            if (para != null)
            {
              yield return para;
            }
          }
        }
      }
    }

    public static FormattedText GetFormattedText(this FlowDocument doc)
    {
      if (doc == null)
      {
        throw new ArgumentNullException("doc");
      }

      FormattedText output = new FormattedText(
        GetText(doc),
        CultureInfo.CurrentCulture,
        doc.FlowDirection,
        new Typeface(doc.FontFamily, doc.FontStyle, doc.FontWeight, doc.FontStretch),
        doc.FontSize,
        doc.Foreground);

      int offset = 0;

      foreach (TextElement el in GetRunsAndParagraphs(doc))
      {
        Run run = el as Run;

        if (run != null)
        {
          int count = run.Text.Length;

          output.SetFontFamily(run.FontFamily, offset, count);
          output.SetFontStyle(run.FontStyle, offset, count);
          output.SetFontWeight(run.FontWeight, offset, count);
          output.SetFontSize(run.FontSize, offset, count);
          output.SetForegroundBrush(run.Foreground, offset, count);
          output.SetFontStretch(run.FontStretch, offset, count);
          output.SetTextDecorations(run.TextDecorations, offset, count);

          offset += count;
        }
        else
        {
          offset += Environment.NewLine.Length;
        }
      }

      return output;
    }

    private static string GetText(FlowDocument doc)
    {
      StringBuilder sb = new StringBuilder();

      foreach (TextElement el in GetRunsAndParagraphs(doc))
      {
        Run run = el as Run;
        sb.Append(run == null ? Environment.NewLine : run.Text);
      }
      return sb.ToString();
    }
  }

وأنا نسخ لصق التعليمات البرمجية وليست في عمود واحد، هل لديك عرض في مكان ما هو صغير؟ ربما تعرف على التعليمات البرمجية خلف على سبيل المثال.

وفقط للسجل وأنا أعتقد أن هذا موضوع مفقود بعض التفسيرات حسب على لماذا : لتنفيذ RichTextBox MeasureOverride هو من هذا القبيل. أنا لن نسمي ذلك الخلل، ربما مجرد سلوك سوء التصميم تبرره حقيقة أن أحب ذكرت للتو فوق FlowDocument ليست رخيصة لقياس بسبب تعقيدها. خلاصة القول، تجنب القيد العرض غير محدود من خلال ربط MinWidth أو لفها في وعاء الحد.

    /// <summary>
    /// Measurement override. Implement your size-to-content logic here.
    /// </summary>
    /// <param name="constraint">
    /// Sizing constraint.
    /// </param>
    protected override Size MeasureOverride(Size constraint)
    {
        if (constraint.Width == Double.PositiveInfinity)
        {
            // If we're sized to infinity, we won't behave the same way TextBox does under
            // the same conditions.  So, we fake it.
            constraint.Width = this.MinWidth;
        }
        return base.MeasureOverride(constraint);
    }

ولقد لاحظت ان كان لي هذه المشكلة فقط عندما أسلوبي ScrollViewer الافتراضي بوضوح تعيين HorizontalScrollBarVisibility=Hidden.
إزالة هذا اضع (وHidden القيمة الافتراضية على أي حال) إصلاح المشكلة عمود واحد بالنسبة لي في بلدي RichTextBox.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top