Eto: [WPF] تحديد RichTextArea لا يعمل بشكل صحيح

تم إنشاؤها على ٤ أكتوبر ٢٠١٨  ·  7تعليقات  ·  مصدر: picoe/Eto

سلوك متوقع

تم تحديد النص بشكل صحيح وفقًا للنطاق المحدد.

السلوك الفعلي

يوجد 5 أحرف في غير موضعها جهة اليمين.

خطوات إعادة إظهار المشكلة

  1. قم بإنشاء عنصر تحكم RichTextArea
  2. أدخل بعض النص
  3. حدد تحديدًا لتعيين لونه

الكود الذي يوضح المشكلة

rtfcontrol.Appen(initialtext, true);
rtfcontrol.Append(sometext, true);
rtfcontrol.Selection = new Range<int>(rtfcontrol.Text.Length - sometext.Length, rtfcontrol.Text.Length -1);
rtfcontrol.SelectionForeground = Colors.Blue;
rtfcontrol.Append("\n", true);
rtfcontrol.Selection = new Range<int>(rtfcontrol.Text.Length);

تحديد

  • الإصدار: 2.5.0-ci-10013
  • المنصة (المنصات): WPF
  • نظام (أنظمة) التشغيل: Windows 10

WPF:

wpf

GTK2 (لينكس):

gtk2_linux

Xamarin.Mac:

xamarin mac

التعليق الأكثر فائدة

DanWBR ، آه نعم ، هذا لن يعمل بالطريقة التي لديك بها لسوء الحظ - يضيف WPF Text (بغض النظر عما إذا كان النص الخاص بك يحتوي عليه أم لا). لم أجد طريقة للتغلب على ذلك في هذه المرحلة ، لكنها قضية منفصلة عن هذه المشكلة.

ما أوصي به هو الحفاظ على الموضع الحالي في متغير وزيادته بعد إلحاق النص. الوصول إلى الخاصية Text كل مرة للحصول على الطول سيتباطأ كلما زاد حجم النص.

ال 7 كومينتر

في Windows ، لا يتم حساب أحرف نهاية السطر بطريقة أو بأخرى إلى فهارس التحديدات. أنا حاليًا أستخدم الكود التالي كحل بديل:

private void Write(string message, Color c)
        {
            Append(message + Environment.NewLine, true);

            int idx = -1, last = -1;
            if (Environment.OSVersion.Platform == PlatformID.Unix)
            {
                idx = Text.LastIndexOf(message);
                last = Text.Length;
            }
            else
            {
                var lines = string.Join("", Text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries));
                idx = lines.LastIndexOf(message);
                last = lines.Length;
            }

            if (idx == -1)
                return;

            Selection = new Range<int>(idx, idx + message.Length);
            SelectionForeground = c;
            Selection = new Range<int>(last, last);
        }

لكن هذا بالتأكيد خطأ ...

نعم لقد استخدمت نفس الاختراق مثل @ ManuelHu من قبل ، إنه ليس جميلًا. لست متأكدًا حتى الآن من كيفية معالجة هذا الأمر بشكل فعال دون أن تكون بطيئًا عند استخدام نص كبير.

شكرا للإبلاغ عن هذه المسألة!

مرحبًا DanWBR ،

يجب إصلاح هذا في أحدث فرع تطوير. هل يمكنك أن تجربها؟ على جميع الأنظمة الأساسية ، يتم التعامل مع الأسطر الجديدة الآن على أنها حرف \n .

مرحبًا cwensley ، لا يزال هناك شخصية واحدة يجب إصلاحها:

captura de tela 2018-11-16 as 08 06 39

مرحبًا DanWBR ، هل لديك وصف للخروج من خلال إصدار واحد؟ لا يمكنني إعادة إنتاجه.

https://github.com/DanWBR/dwsim5/blob/windows/DWSIM.UI.Desktop.Forms/Forms/Flowsheet/Flowsheet.eto.cs#L1245

ربما أستخدم فهارس خاطئة؟ إنه يعمل على macOS و GTK ، رغم ذلك.

DanWBR ، آه نعم ، هذا لن يعمل بالطريقة التي لديك بها لسوء الحظ - يضيف WPF Text (بغض النظر عما إذا كان النص الخاص بك يحتوي عليه أم لا). لم أجد طريقة للتغلب على ذلك في هذه المرحلة ، لكنها قضية منفصلة عن هذه المشكلة.

ما أوصي به هو الحفاظ على الموضع الحالي في متغير وزيادته بعد إلحاق النص. الوصول إلى الخاصية Text كل مرة للحصول على الطول سيتباطأ كلما زاد حجم النص.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات