مشاركة عبر


تهيئة عناصر كائن ليس موجود في شجرة الكائن

بعض أوجه Windows Presentation Foundation (WPF) يتم تأجيل التهيئة للعمليات التي تعتمد عادةً على ربط هذا العنصر إما شجرة المنطقية أو شجرة المرئية . هذا الموضوع يصف الخطوات التي قد تكون ضرورية من أجل تهيئة أحد العناصر التي لا علاقة له إما شجرة.

يشتمل هذا الموضوع على الأقسام التالية.

  • عناصر وشجرة المنطقية
  • موضوعات ذات صلة

عناصر وشجرة المنطقية

عند إنشاء مثيل Windows Presentation Foundation (WPF) الفئة في التعليمات البرمجية "، يجب عليك أن تدرك أن جوانب عديدة من كائن تهيئة للحصول Windows Presentation Foundation (WPF) عن عمد ليست فئة جزءاً من التعليمات البرمجية التي يتم تنفيذه عند استدعاء منشئ فئة. ولا سيما لفئة المراقبة ، لم يتم تعريف أكثر من التمثيل البصري للأن سيطرة المنشئ. بدلا من ذلك ، يتم تعريف تمثيل مرئي من عنصر التحكم القالب. يحتمل أن يكون القالب تأتي من مصادر متنوعة ولكن غالباً الحصول عليها من السمة أنماط القالب. القوالب بشكل فعال في وقت متأخر من الملزمة ، وليس القالب اللازمة التي تعلق على التحكم في المسألة حتى السيطرة على استعداد للتخطيط. والسيطرة ليست مستعدة لتخطيط حتى تعلق على شجرة المنطقية التي تربط إلى سطح جعلها في جذورها. إنه ذلك عنصر المستوى الجذر الذي يبدأ عرض العناصر التابعة الخاصة به كما هو موضح في شجرة منطقية.

الشجرة المرئية أيضاً يشارك في هذه العملية. العناصر التي تشكل جزءا من شجرة البصرية من خلال القوالب هنا أيضا لا مثيل تماما حتى المتصلة.

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

باستخدام BeginInit EndInit لتهيئة العنصر.

الفئات المختلفة في WPF تطبيق ISupportInitialize واجهه. استخدم BeginInit و EndInit أساليب واجهة لتدل على منطقة في التعليمات البرمجية الخاصة بك على خطوات التهيئة (مثل تعيين قيم الخصائص التي تؤثر على تقديم). بعد EndInitويسمى في التسلسل ، لا يمكن للنظام تخطيط عملية العنصر والبدء في البحث عن نمط ضمنية.

إذا كان العنصر يتم تعيين خصائص على FrameworkElement أو FrameworkContentElement اشتقاق فئة ثم استدعاء إصدارات فئة BeginInit و EndInit بدلاً من النوع ISupportInitialize.

نموذج لتعليمة برمجية

المثال التالي هو نموذج التعليمة البرمجية لتطبيق وحدة تحكم يستخدم التقديم واجهات API و XamlReader.Load(Stream) من غير المحكم XAML الملف لتوضيح موضع المناسبة BeginInit EndInit حول البعض API المكالمات التي ضبط خصائص التي تؤثر على التقديم.

يوضح المثال الدالة الرئيسي فقط. Rasterize دالات Save (غير معروضة) يتم دالات الأداة المساعدة التي تستغرق تتولى معالجة الصورة IO.

        <STAThread>
        Shared Sub Main(ByVal args() As String)
            Dim e As UIElement
            Dim _file As String = Directory.GetCurrentDirectory() & "\starting.xaml"
            Using stream As Stream = File.Open(_file, FileMode.Open)
                ' loading files from current directory, project settings take care of copying the file
                Dim pc As New ParserContext()
                pc.BaseUri = New Uri(_file, UriKind.Absolute)
                e = CType(XamlReader.Load(stream, pc), UIElement)
            End Using

            Dim paperSize As New Size(8.5 * 96, 11 * 96)
            e.Measure(paperSize)
            e.Arrange(New Rect(paperSize))
            e.UpdateLayout()

'            
'             *   Render effect at normal dpi, indicator is the original RED rectangle
'             
            Dim image1 As RenderTargetBitmap = Rasterize(e, paperSize.Width, paperSize.Height, 96, 96)
            Save(image1, "render1.png")

            Dim b As New Button()
            b.BeginInit()
            b.Background = Brushes.Blue
            b.Height = 200
            b.Width = b.Height
            b.EndInit()
            b.Measure(paperSize)
            b.Arrange(New Rect(paperSize))
            b.UpdateLayout()

            ' now render the altered version, with the element built up and initialized

            Dim image2 As RenderTargetBitmap = Rasterize(b, paperSize.Width, paperSize.Height, 96, 96)
            Save(image2, "render2.png")
        End Sub
[STAThread]
static void Main(string[] args)
{
    UIElement e;
    string file = Directory.GetCurrentDirectory() + "\\starting.xaml";
    using (Stream stream = File.Open(file, FileMode.Open))
    {
        // loading files from current directory, project settings take care of copying the file
        ParserContext pc = new ParserContext();
        pc.BaseUri = new Uri(file, UriKind.Absolute);
        e = (UIElement)XamlReader.Load(stream, pc);
    }

    Size paperSize = new Size(8.5 * 96, 11 * 96);
    e.Measure(paperSize);
    e.Arrange(new Rect(paperSize));
    e.UpdateLayout();

    /*
     *   Render effect at normal dpi, indicator is the original RED rectangle
     */
    RenderTargetBitmap image1 = Rasterize(e, paperSize.Width, paperSize.Height, 96, 96);
    Save(image1, "render1.png");

    Button b = new Button();
    b.BeginInit();
    b.Background = Brushes.Blue;
    b.Width = b.Height = 200;
    b.EndInit();
    b.Measure(paperSize);
    b.Arrange(new Rect(paperSize));
    b.UpdateLayout();

    // now render the altered version, with the element built up and initialized

    RenderTargetBitmap image2 = Rasterize(b, paperSize.Width, paperSize.Height, 96, 96);
    Save(image2, "render2.png");
}

راجع أيضًا:

المبادئ

الأشجار فى الWPF

نظرة عامة حول تقديم رسومات WPF

نظرة عامة على XAML (WPF)