سؤال

ما هو فرق بين هذه الرواسب 2:

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{TemplateBinding Property=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

و

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

?

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

المحلول

TemplateBinding ليست نفس الشيء تماما. غالبا ما يتم كتاب مستندات MSDN من قبل أشخاص يتعين عليهم اختبار SDES Monosylabic حول ميزات البرامج، وبالتالي فإن الفروق الدقيقة ليست صحيحة.

يتم تقييم TemplateBindings في وقت ترجمة الوقت مقابل النوع المحدد في قالب التحكم. هذا يسمح بمثابة مثيل أسرع بكثير من القوالب المترجمة. فقط تلمس الاسم في templateBinding وسترى أن المحول البرمجي سوف يذكر ذلك.

تم حل علامة التجليد في وقت التشغيل. في حين أن الأبطأ لتنفيذ، فإن الربط سيحل أسماء الممتلكات غير المرئية على النوع الذي أعلنه القالب. عن طريق أبطأ، سأشير إلى أن نوعه من قريبه لأن عملية التجليد تأخذ القليل جدا من وحدة المعالجة المركزية للتطبيق. إذا كنت تقوم بتفجير قوالب التحكم حولها بسرعة عالية، فقد تلاحظها.

كمسألة ممارسة تستخدم TemplateBinding عندما لا تستطيع ولكن لا تخشى الملزمة.

نصائح أخرى

templateBinding. - أكثر تحد من استخدام ملزمة منتظمة

  • أكثر كفاءة من ملزمة ولكن لديها وظيفة أقل
  • يعمل فقط داخل شجرة مرئية للتحكم
  • لا يعمل مع خصائص على التجميد
  • لا يعمل ضمن الزناد التحكم في التحكم
  • يوفر اختصارا في إعداد الخصائص (وليس كأكرار)، على سبيل المثال {templateBinding targetproperty}

عادي ربط - ليس لديه القيود فوق TemplateBinding

  • يحترم الخصائص الأصل
  • إعادة تعيين القيم المستهدفة لمسح أي قيم تعيين صراحة
  • مثال:u003CEllipse Fill="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Background}"/>

شيء آخر - TemplateBindings لا تسمح بتحويل القيمة. إنهم لا يسمحون لك بتمرير محول ولا يقومون تلقائيا بتحويل السلسلة على سبيل المثال (وهو أمر طبيعي لربط).

TemplateBinding هو اختصار للتملزم مع TempleattParent ولكنه لا يعرض كل إمكانات الطبقة الملزمة، على سبيل المثال لا يمكنك التحكم في Binding.mode من TemplateBinding.

قالب التنورس

يتيح هذا الوضع ربط خاصية ControltemTemplate معينة إلى خاصية عنصر التحكم الذي يتم تطبيق التحكم فيه. لفهم المشكلة هنا هو مثال عاليا

<Window.Resources>
    <ControlTemplate x:Key="template">
        <Canvas>
            <Canvas.RenderTransform>
                <RotateTransform Angle="20"/>
            </Canvas.RenderTransform>
            <Ellipse Height="100" Width="150" 
                     Fill="{Binding 
                RelativeSource={RelativeSource TemplatedParent},
                Path=Background}">

            </Ellipse>
            <ContentPresenter Margin="35" 
                      Content="{Binding RelativeSource={RelativeSource  
                      TemplatedParent},Path=Content}"/>
        </Canvas>
    </ControlTemplate>
</Window.Resources>

<Canvas Name="Parent0">
    <Button   Margin="50" 
              Template="{StaticResource template}" Height="0" 
              Canvas.Left="0" Canvas.Top="0" Width="0">
        <TextBlock FontSize="22">Click me</TextBlock>
    </Button>
</Canvas>

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

اعتقدت أن TemplateBinding لا يدعم أنواعا قابلة للتجميل (بما يتضمن كائنات الفرشاة). للحصول على المشكلة. يمكن للمرء الاستفادة من templatedparent

يتم استخدامها بطريقة مماثلة ولكن لديهم بعض الاختلافات. هنا رابط وثائق TemplateBinding:http://msdn.microsoft.com/en-us/library/ms742882.aspx.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top