locked
בעיה מוזרה עם RichTextBox RRS feed

  • שאלה

  • הי,
    יש לי קונטרול של RichTextBox - ובזמן ריצה אני טוען אליו את התוכן מקובץ RTF כלשהו,
    שמתי לב לבעיה מוזרה עם רשימות BULLET, משום מה במקום שלאחר Bullet יהיה רווחים - כמו בקובץ, הקונטרול מציג ללא רווחים - הסבר יותר ברור:
    בקובץ:
    • Text
    • Text2
    • Text3
    • Text4

    מה שהקונטרול מציג זה:
    •Text
    •Text2
    •Text3
    •Text4

    בדקתי ומה התוכן הXML שהוא מכיל בתוכו - מסתבר שעבור כל BULLET הוא נעטף בקונטרול RUN אשר נעטף בתורו בקונטרול SPAN אשר הפרופרטי - FontFamily  מוגדר כ"Symbol".
    אז מה שחשבתי לעשות זה להוסיף סטייל עבור Span ואם הפרופרטי - FontFamily  מוגדר כ"Symbol" - אזי להוסיף קונטרול Run עבור הרווחים? זה אפשרי? אם לא אז אולי זה יהיה אפשרי בDEPENDENCY PROPERTY?

    או שמישהו כבר מימש תיקון כלשהו לבעיה הזו?

    יום רביעי 28 מאי 2014 14:06

תשובות

  •  Converter יכול לעזור
    • סומן כתשובה על-ידי Eran Sharvit שבת 07 יוני 2014 15:49
    יום שני 02 יוני 2014 09:53
  • בסוף אני תיקנתי דרך הקוד, אני מבצע מעבר על כל הInlines מסוג Run, אם האובייקט מכיל ·, אזי אני מתקן אותו כך שיעומד כפי שצריך.

    להלן הקוד - למי שיחפש בעתיד:

     const string TAB = "\t";
            const int SPACES = 7;
            const string SYMBOL = "o\t";
            const string SYMBOL_FULL = "·\t";
            readonly static string[] _patterns = new string[] { SYMBOL_FULL, SYMBOL };
    
     private static void ParseDocument()
            {
                List<Run> markers = ParseDocumentInternal();
                ReplaceMarkers(markers);
            }
    
            private static List<Run> ParseDocumentInternal()
            {
                List<Run> markers = new List<Run>();
    
                foreach (Block block in _originalDocument.Blocks)
                {
                    Paragraph paragraph = block as Paragraph;
                    if (paragraph == null)
                        continue;
    
                    foreach (Inline inline in paragraph.Inlines)
                    {
                        if (inline is Span)
                        {
                            Span span = inline as Span;
                            if (span == null)
                                continue;
    
                            Run run = span.Inlines.FirstInline as Run;
                            if (run == null)
                                continue;
    
                            FindMarker(markers, run);
                        }
                        else if (inline is Run)
                        {
                            Run run = inline as Run;
                            if (run == null)
                                continue;
                            FindMarker(markers, run);
                        }
                    }
                }
                return markers;
            }
    
            private static void ReplaceMarkers(List<Run> markers)
            {
                foreach (Run run in markers)
                {
                    run.Text = run.Text.Replace(TAB, string.Empty);
                    if (run.Text == SYMBOL)
                    {
                        run.Text = string.Empty.PadLeft(SPACES) + run.Text.PadRight(SPACES);
                    }
                    else
                    {
                        run.Text = run.Text.PadLeft(SPACES);
                    }
                }
            }
    
    
            private static void FindMarker(List<Run> markers, Run run)
            {
                foreach (var pattern in _patterns)
                {
                    FindMarkerInternal(pattern, markers, run);
                }
            }
    
            private static void FindMarkerInternal(string pattern, List<Run> markers, Run run)
            {
                Regex regex = new Regex(pattern);
                MatchCollection matches = regex.Matches(run.Text);
                foreach (Match match in matches)
                {
                    markers.Add(run);
                }
            }

    • סומן כתשובה על-ידי Eran Sharvit שבת 07 יוני 2014 15:48
    יום חמישי 05 יוני 2014 09:52

כל התגובות

  • בקרוב מומחי הקהילה ינסו לסייע.

    תודה.


    מיקרוסופט מציעה שירות זה ללא תשלום, למטרת סיוע למשתמשים והעשרת הידע הקשור בטכנולוגיות ובמוצרים של מיקרוסופט. תוכן זה מתפרסם כפי שהוא והוא אינו מעיד על כל אחריות מצד מיקרוסופט.

    יום ראשון 01 יוני 2014 11:16
  •  Converter יכול לעזור
    • סומן כתשובה על-ידי Eran Sharvit שבת 07 יוני 2014 15:49
    יום שני 02 יוני 2014 09:53
  • בסוף אני תיקנתי דרך הקוד, אני מבצע מעבר על כל הInlines מסוג Run, אם האובייקט מכיל ·, אזי אני מתקן אותו כך שיעומד כפי שצריך.

    להלן הקוד - למי שיחפש בעתיד:

     const string TAB = "\t";
            const int SPACES = 7;
            const string SYMBOL = "o\t";
            const string SYMBOL_FULL = "·\t";
            readonly static string[] _patterns = new string[] { SYMBOL_FULL, SYMBOL };
    
     private static void ParseDocument()
            {
                List<Run> markers = ParseDocumentInternal();
                ReplaceMarkers(markers);
            }
    
            private static List<Run> ParseDocumentInternal()
            {
                List<Run> markers = new List<Run>();
    
                foreach (Block block in _originalDocument.Blocks)
                {
                    Paragraph paragraph = block as Paragraph;
                    if (paragraph == null)
                        continue;
    
                    foreach (Inline inline in paragraph.Inlines)
                    {
                        if (inline is Span)
                        {
                            Span span = inline as Span;
                            if (span == null)
                                continue;
    
                            Run run = span.Inlines.FirstInline as Run;
                            if (run == null)
                                continue;
    
                            FindMarker(markers, run);
                        }
                        else if (inline is Run)
                        {
                            Run run = inline as Run;
                            if (run == null)
                                continue;
                            FindMarker(markers, run);
                        }
                    }
                }
                return markers;
            }
    
            private static void ReplaceMarkers(List<Run> markers)
            {
                foreach (Run run in markers)
                {
                    run.Text = run.Text.Replace(TAB, string.Empty);
                    if (run.Text == SYMBOL)
                    {
                        run.Text = string.Empty.PadLeft(SPACES) + run.Text.PadRight(SPACES);
                    }
                    else
                    {
                        run.Text = run.Text.PadLeft(SPACES);
                    }
                }
            }
    
    
            private static void FindMarker(List<Run> markers, Run run)
            {
                foreach (var pattern in _patterns)
                {
                    FindMarkerInternal(pattern, markers, run);
                }
            }
    
            private static void FindMarkerInternal(string pattern, List<Run> markers, Run run)
            {
                Regex regex = new Regex(pattern);
                MatchCollection matches = regex.Matches(run.Text);
                foreach (Match match in matches)
                {
                    markers.Add(run);
                }
            }

    • סומן כתשובה על-ידי Eran Sharvit שבת 07 יוני 2014 15:48
    יום חמישי 05 יוני 2014 09:52