سؤال

أريد أن أكون قادرًا على السحب إلى أعلى نص textblock ، ووجدت طريقة للقيام بذلك ، لكن لا يمكنني إزالة الرسم بمجرد وجوده. هنا هو الرمز.

   public class DerivedTextBlock : TextBlock {

      public Boolean DrawExtra {
         get { return (Boolean)GetValue(DrawExtraProperty); }
         set { SetValue(DrawExtraProperty, value); }
      }

      // Using a DependencyProperty as the backing store for DrawExtra.  This enables animation, styling, binding, etc...
      public static readonly DependencyProperty DrawExtraProperty =
          DependencyProperty.Register("DrawExtra", typeof(Boolean), typeof(DerivedTextBlock), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsArrange));

      public DrawingVisual DrawingVisual { get; set; }

      public DerivedTextBlock() {
         DrawingVisual = this.CreateDrawingVisualRectangle();
      }

      protected override int VisualChildrenCount {
         get {
            //if we want to draw our extra info, add one to
            // our visualChildrenCount, usually with a textblock it is 0
            if (DrawExtra) {
               return base.VisualChildrenCount + 1;
            }
            else {
               return base.VisualChildrenCount;
            }
         }
      }

      protected override Visual GetVisualChild(int index) {
         return DrawingVisual;
      }

      // Create a DrawingVisual that contains a rectangle.
      private DrawingVisual CreateDrawingVisualRectangle() {
         DrawingVisual drawingVisual = new DrawingVisual();

         // Retrieve the DrawingContext in order to create new drawing content.
         DrawingContext drawingContext = drawingVisual.RenderOpen();

         // Create a rectangle and draw it in the DrawingContext.
         Rect rect = new Rect(new Point(10.0, 0), new Size(10.0 / 2.0, 10));
         drawingContext.DrawRectangle(Brushes.LightBlue, (Pen)null, rect);

         // Persist the drawing content.
         drawingContext.Close();

         return drawingVisual;
      }
   }

السبب في أنني أرغب في القيام بذلك: لدينا بيانات بيانات مع الكثير من الخلايا ، كل خلية تعرض نصًا. نعرض بعض معلومات التحقق من الصحة على الخلايا ونقوم بذلك باستخدام قالب مع نصي وبعض المسارات تستضيف في الشبكة. يضيف النفقات العامة لهذا العناصر الإضافية إلى الشجرة المرئية وعندما يتعين علينا إعادة رسم (عند التحميل أو تبديل النوافذ أو على نوع) ، يستغرق الأمر وقتًا أطول كلما زاد عدد العناصر في الشجرة المرئية. عندما يكون مجرد نصوص ، يكون حوالي 1/3 - 1/2 أسرع من التحكم في الشبكة. لذلك نود رسم أشياء التحقق من الصحة لدينا أعلى مربع النص.

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

المحلول

مشاكلك هي:

  1. يجب أن يعيد GetViSualChild () base.getVisualChild (فهرس) إلا عند الفهرس == base.visualChildRencount.
  2. لقد نسيت استدعاء AddVisualChild () عندما يصبح DrawExtra صحيحًا أو تغييرًا مرئيًا
  3. لقد نسيت استدعاء removeVisualChild () عندما يصبح Dressionextra كاذبة أو تغييرات مرئية

يمكنك إصلاح #2 و #3 عن طريق تعيين PropertyChangedCallback على DrawingExtra وإضافة رمز إلى Setter of DrawingVisual.

Explanation: إنها استدعاء AddvisualChild () التي تضيف بالفعل المرئي إلى الشجرة. ما يحدث هو أنه يتم العثور على بصريك وعرضه "عن طريق الخطأ" بسبب خطأك في GetViSualChild () ، ولكن لا يتم ربطه بشكل صحيح بالشجرة المرئية حتى تواجه العديد من المشكلات.

تحديث

لقد قمت بتحرير التعليمات البرمجية الخاصة بك كما هو موضح أعلاه ، وقد عملت تمامًا. ها هي التغييرات:

...
      {
        PropertyChangedCallback = (obj, e) =>
          {
            var textBlock = (DerivedTextBlock)obj;
            if((bool)e.OldValue) textBlock.RemoveVisualChild(textBlock.DrawingVisual);
            if((bool)e.NewValue) textBlock.AddVisualChild(textBlock.DrawingVisual);
          }
      });

  public DrawingVisual DrawingVisual
  {
    get { return _drawingVisual; }
    set
    {
      if(DrawExtra) RemoveVisualChild(_drawingVisual);
      _drawingVisual = value;
      if(DrawExtra) AddVisualChild(_drawingVisual);
    }
  }
  private DrawingVisual _drawingVisual;

...

  protected override int VisualChildrenCount
  {
    get { return base.VisualChildrenCount + (DrawExtra ? 1 : 0); }
  }

  protected override Visual GetVisualChild(int index)
  {
    return index==base.VisualChildrenCount ? DrawingVisual : base.GetVisualChild(index);
  }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top