سؤال

لست متأكدا متى يجب أن أستخدمه ContentPresenter بدلاً من ContentControl (والعكس صحيح).في الوقت الحالي، أنا أستخدم ContentControl إلى حد كبير في كل وقت في بلدي DataTemplateس.متى سوف ContentPresenter يكون خيارا أفضل؟و لماذا؟

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

المحلول

ContentControl هو فئة أساسية للضوابط التي تحتوي على عناصر أخرى ولها Contentبروبيرتي (على سبيل المثال، Button).

ContentPresenter يستخدم داخل قوالب التحكم في الداخل لعرض المحتوى.

ContentControl, ، عند استخدامها مباشرة (من المفترض أن يتم استخدامها كطبقة أساسية)، لها قالب مراقبة يستخدم ContentPresenter لعرض محتوىه.

قواعد الإبهام الخاصة بي (غير قابلة للتطبيق في كل حالة، استخدم حكمك):

  1. في داخل ControlTemplate استعمال ContentPresenter
  2. خارج ControlTemplate (بما فيها DataTemplate والقوالب الخارجية) حاول ألا تستخدم أي منها، إذا كنت بحاجة إلى ذلك، يجب أن تفضل ContentPresenter
  3. Subclass. ContentControl إذا كنت تقوم بإنشاء عنصر تحكم مخصص "لا أملس" يعمل المحتوى المضيف ولا يمكنك الحصول على نفس النتيجة عن طريق تغيير قالب عنصر تحكم موجود (يجب أن يكون نادرا للغاية).

نصائح أخرى

عادة ما يتم استخدام contentpresenter عادة في عنصر تحكم، كصحة نائبة ليقول "وضع المحتوى الفعلي هنا".

يمكن استخدام ContentControl في أي مكان، وليس بالضرورة في قالب. وسوف تلتقط أي datatemplate محددة لنوع المحتوى المعين به

لقد كتبت مؤخرا منشورا على مدونتي فيما يتعلق بهذين الضبطين:

contentpresenter vs contentcontrol. (تحرير: استبدال الرابط المكسور بالإصدار المؤرشفة.)

ال contentpresenter.contentsource. هو ما يجعل الفرق الأكبر في الواقع بين الطبقتين. تتميز خاصية Contentsource بالمعنى فقط داخل عنصر تحكم؛ يحدد خاصية Templeateparent التي يجب تعيين المحتوى. على سبيل المثال، إذا كان عنصر التحكم يحتوي على خاصية التبعية MyProperty1, ، ثم قد نجد ما يلي داخل ControlTemplate:

<ControlTemplate TargetType="MyControl" >
    [...]
       <ContentPresenter ContentSource="MyProperty1" />
    [...]
</ControlTemplate>

سيتلقى محتوى ContentPresenter قيمة MyProperty1.

يرجى ملاحظة أنه إذا كان اسم العقار هو Content, ، ليست هناك حاجة لتحديد ContentSource كما هي القيمة الافتراضية.

بالنسبة لأولئك الذين يعرفون الأنجوزون: هذا يشبه تحويل الميكانوية.

في بعض الأحيان يكون المثال أسهل من Jargon النظرية. في موقع MS على الويب (انتقل إلى أسفل: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(V=VS.110).aspx.)، يستخدم زر كمثال. يحتوي الزر على ContentControl، مما يتيح لك وضع عنصر تحكم واحد أو عنصر تحكم مخصص يمكن أن يكون صورة ونص وصندوق اختيار و STACKPANEL وشبكة، أيا كان.

بعد تخصيص زر، الآن على XAML، يمكنك الكتابة

<my:Button>
   <my:Button.Content>
      <my:AnotherControl>
   </my:Button.Content>
</my:Button>

في رمز المثال أعلاه، "My: My Button.content" هو ContentControl. ستكون OtherControl مكانا لما حددته حيث يوجد contentpresenter.

وبالمثل، عند مقارنة TextBox و TextBlock، يحتوي TextBox على contentpresenter بالنسبة لك لأشياء الأشياء فيها تماما مثل المثال أعلاه مثال على زر TextBlock. يسمح لك TextBlock فقط بإدخال نص.

إنه سؤال قديم ولكني كنت على وشك الانتهاء من تطوير برنامج Tile Control المتحرك، وهو قالب يعتمد على تطبيق عالمي، انظر إلى هذا الرمز من Phone WP7/8 SDK القديم:

<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
    <ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>

هنا يمكنك رؤية ContentControl وهو الحاوية والمقدم لعرض المحتوى.في معظم الحالات، سيكون ControlTemplate هو الحاوية، ولكن إذا كنت تريد ذلك، يمكنك استخدام ControlTemplate ControlTemplate حاوية أخرى يمكنك وضع حاوية إضافية: ContentControl فيه ولتقديم المحتوى بشكل منفصل ContentPresenter.إذا لم تكن بحاجة إلى حاوية منفصلة، ​​فما عليك سوى استخدامها ControlTemplate و ControlPresenters لعرض كتل المحتوى، على الأقل هذا ما فعله العاملون في Microsoft عندما قاموا بتطوير WP7/8 SDK.يمكن أيضًا استخدام ContentControl لعرض المحتوى ولكنه يعمل بعد ذلك كحاوية ومقدم.لذا، في نموذج التعليمات البرمجية أعلاه، تم تقسيم الغرض منه إلى الحاوية والمقدم.في العينات الديناميكية، يمكنك عرض الحاوية (يمكن أن تحتوي على خلفية فارغة أو شيء غير موجود بعد) ثم تعبئتها ديناميكيًا بمحتوى المقدم.تحتوي الحاوية على أبعاد (العرض والارتفاع وما إلى ذلك)، ويمكنك وضع هذه الخصائص في عنصر تحكم الحاوية وتقديم المحتوى عليها.في العينة، يحدد ContentControl ما يجب فعله بمحتوى مقدم العرض.

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