حدد المستقيم المحبط لعنصر WPF بالنسبة لبعض الوالدين

StackOverflow https://stackoverflow.com/questions/3472388

  •  28-09-2019
  •  | 
  •  

سؤال

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

لقد حاولت استخدام LayoutInformation.GetLayoutSlot ولكن يبدو أن هذا يعود Rect في 0،0 ولا يعكس الموقع الفعلي للعنصر.

ما أحاول القيام به هو أخذ "لقطة شاشة" للنافذة باستخدام RenderTargetBitmap ثم اقتصره على عنصر معين ، لكن لا يمكنني الحصول على حدود العنصر لمعرفة ما الذي يجب أن تقطع صورة نقطية!

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

المحلول

الأمر بسيط للغاية:

public static Rect BoundsRelativeTo(this FrameworkElement element,
                                         Visual relativeTo)
{
  return
    element.TransformToVisual(relativeTo)
           .TransformBounds(LayoutInformation.GetLayoutSlot(element));
}

في الواقع قد يكون من المبالغة وضعه بطريقة منفصلة.

نصائح أخرى

خيار LayoutsLot لم ينجح بالنسبة لي على الإطلاق. انتهى الأمر إلى إعطائي موقفًا من الطفل بالنسبة لسيطرة الوالد/الأجداد المحدد:

    public static Rect BoundsRelativeTo(this FrameworkElement child, Visual parent)
    {
        GeneralTransform gt = child.TransformToAncestor(parent);
        return gt.TransformBounds(new Rect(0, 0, child.ActualWidth, child.ActualHeight));
    }

فما باللك ، تمكنت أخيرًا من اكتشاف ذلك باستخدام مزيج من LayoutInformation.GetLayoutSlot() (على الرغم من أنني ربما كان من الممكن أن أستخدم أيضًا ActualWidth/ActualHeight أو RenderSize) و UIElement.TranslatePoint().

يبدو حلاً معقدًا إلى حد ما عندما يكون الأمر بسيطًا مثل هذا:

myElement.GetBounds( relativeElement );

اوه حسناً. ربما الوقت لطريقة التمديد. قون

مع الأخذ في الاعتبار بعض الاقتراحات التي وجدتها هنا حل المشكلة بالنسبة لي.

item.TransformToVisual( relativeToElement )
    .TransformBounds( new Rect( item.RenderSize ) );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top