ContentControl এবং ContentPresenter এর মধ্যে পার্থক্য কী?


208

আমি কখন (এবং তদ্বিপরীত) ContentPresenterপরিবর্তে কখন ব্যবহার করব তা নিশ্চিত নই ContentControl। এই মুহুর্তে, আমি ContentControlআমার DataTemplateএস তে বেশিরভাগ সময় ব্যবহার করছি । কখন ContentPresenterএকটি ভাল পছন্দ হবে? এবং কেন?

উত্তর:


163

ContentControlনিয়ন্ত্রণের জন্য একটি বেস শ্রেণি যা অন্যান্য উপাদানগুলি ধারণ করে এবং একটি- Contentপ্রপার্টি রয়েছে (উদাহরণস্বরূপ Button)।

ContentPresenter সামগ্রী প্রদর্শন করতে নিয়ন্ত্রণ টেম্পলেটগুলির অভ্যন্তরে ব্যবহৃত হয়।

ContentControl, যখন সরাসরি ব্যবহার করা হয় (এটি বেস শ্রেণি হিসাবে ব্যবহৃত হবে বলে মনে করা হয়), এর একটি নিয়ন্ত্রণ টেম্পলেট থাকে যা এর বিষয়বস্তু প্রদর্শন করতে ContentPresenter ব্যবহার করে।

আমার নিয়মের থাম্ব (প্রতিটি ক্ষেত্রে প্রযোজ্য নয়, আপনার রায় ব্যবহার করুন):

  1. ভিতরে ControlTemplateব্যবহারContentPresenter
  2. বাইরে ControlTemplate( DataTemplateটেমপ্লেট সহ এবং বাইরে) এগুলির কোনও ব্যবহার না করার চেষ্টা করুন, আপনার যদি প্রয়োজন হয় তবে আপনাকে অবশ্যই পছন্দ করতে হবেContentPresenter
  3. সাবক্লাসটি ContentControlযদি আপনি সেই হোস্ট সামগ্রীতে একটি কাস্টম "বর্ণহীন" নিয়ন্ত্রণ তৈরি করে থাকেন এবং কোনও বিদ্যমান নিয়ন্ত্রণের টেম্পলেট পরিবর্তন করে আপনি একই ফলাফল পেতে পারেন না (এটি অত্যন্ত বিরল হওয়া উচিত)।

1
এর অর্থ কি, সাধারণভাবে, আমার সম্ভবত আমার ডেটা টেম্পলেটগুলির কন্টেন্টপ্রেসেন্টার ব্যবহার করা উচিত, কারণ এটি বেশি হালকা-ওজন (তবে এই জাতীয় ডেটা টেম্প্লেট ব্যবহার করার সময় কার্যত সমতুল্য)? তারপরে, আমি কী নতুন নিয়ন্ত্রণ লিখছি তবে কেবলমাত্র কন্টেন্টকন্ট্রোলটিকে বেস ক্লাস হিসাবে ব্যবহার করবেন?
উইলকা

আমি আরো বিশদ বিবরণ সহ উত্তর সম্পাদনা করেছেন যখন আমি ContentPresenter এবং যখন ContentControl ব্যবহার করেন
Nir

1
ঠিক আছে, আমি ধারণা পেয়েছি যে বিষয়বস্তু নিয়ন্ত্রণের পরিবর্তে টেমপ্লেটগুলিতে কন্টেন্টপ্রেসেন্টার ব্যবহার করা উচিত, তবে কেন?
SLL

32
@ এসএলএল - কনটেন্টকন্ট্রোল হ'ল "কন্টেন্ট" প্রদর্শন করে এমন প্রতিটি নিয়ন্ত্রণের জন্য বেস শ্রেণি (উদাহরণ: লেবেল), বিষয়বস্তু প্রদর্শন করতে কনটেন্ট কন্ট্রোল দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত কোডটি কনটেন্টপ্রেসেন্টার - সুতরাং: 1. কন্টেন্টপ্রেসেন্টার আরও বেশি হালকা, 2. কন্টেন্টপ্রেসেন্টার ডিজাইন করা হয়েছে নিয়ন্ত্রণ টেম্পলেটগুলির অভ্যন্তরে ব্যবহার করা হবে এবং ৩. কনটনেটপ্রেসেন্টারটি যেমনটি ব্যবহৃত হয়েছে তেমন ডিজাইন করা হয়েছে যখন কনটেন্টকন্ট্রলটি প্রসারিত করার জন্য ডিজাইন করা হয়েছে (উত্তরাধিকার সূত্রে প্রাপ্ত)
নীর

23
বিষয়বস্তুর সম্পত্তি সেট করার বিষয়টি আসে কনটেন্টপ্রেসেন্টার কন্টেন্টকন্ট্রোল থেকে আলাদা আচরণ করে। আপনি যখন সামগ্রী বিষয়বস্তুর বৈশিষ্ট্যের সাথে মিল রাখার জন্য কন্টেন্টপ্রেসেন্টারের সামগ্রী সম্পত্তি সেট করে তার ডেটা কনটেক্সট পরিবর্তন করে তবে কন্টেন্টকন্ট্রোলের ডেটা কনটেক্সটটি প্রভাবিত হয় না। বাইন্ডিংয়ের মাধ্যমে কনটেন্টপ্রেসেন্টারে সেট করা আপনার যদি অন্য সম্পত্তি থাকে তবে এটি গুরুত্বপূর্ণ, কারণ একবার ডেটা কনটেক্সট পরিবর্তন হয়ে গেলে সমস্ত বাইন্ডিংগুলি সেই উত্স হিসাবে ব্যবহার করে।
ব্যবহারকারী 195275

25

"প্রকৃত সামগ্রী এখানে রাখুন" বলার জন্য প্লেসহোল্ডার হিসাবে কন্টেন্টপ্রেসেন্টার সাধারণত কন্ট্রোলটেম্পলেটটিতে ব্যবহৃত হয়।

কোনও বিষয়বস্তু নিয়ন্ত্রণটি যে কোনও জায়গায় ব্যবহার করা যেতে পারে, অগত্যা কোনও টেমপ্লেটে নয়। এটি এতে নির্ধারিত সামগ্রীর ধরণের জন্য নির্ধারিত যেকোন ডেটা টেম্পলেটটিকে বেছে নেবে


6
কোনও কন্টেন্টপ্রেসেন্টারও কি এটির সামগ্রীতে কোনও ডেটা টেম্প্লেট প্রয়োগ করতে পারে না? এটি কি এর অন্যতম প্রাথমিক উদ্দেশ্য নয়?
ড্রয় নোকস

1
মিমি ... হ্যাঁ, সম্ভবত যাইহোক, বি স্টলনিটসের ব্যাখ্যা আমার চেয়ে অনেক ভাল;)
টমাস লেভস্ক

আপনার সংক্ষিপ্ত উত্তরটি এটিকে দ্রুত সংক্ষেপে বলে মনে করেছে: আমি বিশ্বাস করি যে কন্টেন্টপ্রেসেন্টারের পুরো নকশাটি কেবল ডাটাটেম্পলেট মুদ্রাস্ফীতি "বাস্তবায়ন" করা --- এটি কেবলমাত্র টেমপ্লেটকে সন্ধান এবং স্ফীতকরণের একমাত্র কাজ বলে মনে হয়, ডেটা কনটেক্সটও সেট করে; এবং যথাসম্ভব "অদৃশ্য" হওয়ার চেষ্টা করে (আপনি এখনও স্ফীত টেমপ্লেটের মধ্যে টেক্সটলেমেন্ট বৈশিষ্ট্যগুলির মতো পরিবেষ্টিত বৈশিষ্ট্যগুলিতে আবদ্ধ করতে পারেন, তারপর কনটেন্টপ্রেসেন্টার থেকে এসেছেন)। আপনার অন্যান্য জিনিস নিয়ে চিন্তা করার দরকার নেই এবং এটি কেবল অপেক্ষাকৃত পাতলা উপায়ে টেমপ্লেটকে স্ফীত করে। (আমি স্লিমিমেস্ট খুঁজছি!)
স্টিভেন কোকো

9

আমি সম্প্রতি এই দুটি নিয়ন্ত্রণ সম্পর্কে আমার ব্লগে একটি পোস্ট লিখেছি:

ContentPresenter বনাম ContentControl (সম্পাদনা: ভাঙা লিঙ্ক সংরক্ষণাগারিত সংস্করণ দিয়ে প্রতিস্থাপিত হয়েছে।)

ContentPresenter.ContentSource আসলে দুটি ক্লাস মধ্যে সবচেয়ে বড় পার্থক্য করে তোলে। কন্টেন্টসোর্স সম্পত্তিটি কেবল একটি কন্ট্রোল টেম্প্লেটের মধ্যেই বোঝায়; এটি নির্ধারণ করে যে টেম্প্লেটেড প্যারেন্ট সম্পত্তির সাথে সামগ্রীটি ম্যাপ করা উচিত। উদাহরণস্বরূপ, যদি কোনও নিয়ন্ত্রণে নির্ভরশীল সম্পত্তি থাকে MyProperty1তবে আমরা এর মধ্যে নিম্নলিখিতটি পেতে পারি ControlTemplate:

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

কনটেন্টপ্রেসেন্টারের সামগ্রীটি এর মান পাবে MyProperty1

দয়া করে মনে রাখবেন যে সম্পত্তিটির নামটি যদি হয় তবে এটির ডিফল্ট মান হিসাবে Contentনির্দিষ্ট করার দরকার নেই ContentSource

যারা কৌণিক জে জানেন তাদের জন্য: এটি প্রতিরক্ষা মেকানিজমের অনুরূপ।


2

এটি একটি পুরানো প্রশ্ন তবে আমি সবেমাত্র একটি অ্যানিমেটেড টাইল কন্ট্রোল তৈরির কাজ শেষ করছিলাম, সর্বজনীন অ্যাপ্লিকেশনটির জন্য তৈরি টেমপ্লেটটি, পুরানো ফোন ডাব্লুপি 7/8 এসডিকে থেকে এই কোডটি দেখুন:

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

এখানে আপনি দেখতে পাচ্ছেন কনটেন্টকন্ট্রোলটি সামগ্রী প্রদর্শন করার জন্য ধারক এবং উপস্থাপক। বেশিরভাগ ক্ষেত্রে কন্ট্রোলটাইপলেটটি কনটেইনার হবে তবে আপনি যদি ControlTemplateঅন্য একটি ধারক করতে চান তবে আপনি একটি অতিরিক্ত ধারক রাখতে পারেন: ContentControlএতে এবং সামগ্রীটি আলাদাভাবে উপস্থাপনের জন্য ContentPresenter। আপনার যদি পৃথক ধারক প্রয়োজন না হয় তবে কেবল ControlTemplateএবং ব্যবহার করুনControlPresentersকন্টেন্ট ব্লক প্রদর্শনের জন্য কমপক্ষে মাইক্রোসফ্টে ছেলেরা যখন ডাব্লুপি 7/8 এসডিকে তৈরি করেছিল তখন তারা কী করেছিল what কন্টেন্টকন্ট্রোলটি সামগ্রী প্রদর্শন করার জন্যও ব্যবহার করা যেতে পারে তবে এটি উভয় ধারক এবং উপস্থাপক হিসাবে কাজ করে। সুতরাং উপরের নমুনা কোডটিতে এর উদ্দেশ্যটি ধারক এবং উপস্থাপক হিসাবে বিভক্ত। গতিশীল নমুনায় আপনি ধারকটি প্রদর্শন করতে পারেন (এটির কোনও খালি পটভূমি বা এটি এখনও নেই এমন কিছু থাকতে পারে) এবং তারপরে এটি উপস্থাপক সামগ্রীতে গতিশীলভাবে পূরণ করুন। একটি ধারকটির মাত্রা রয়েছে (প্রস্থ, উচ্চতা ইত্যাদি), আপনি সেই বৈশিষ্ট্যগুলি ধারক নিয়ন্ত্রণে রেখে তাতে লিখিত সামগ্রী উপস্থাপন করেন। নমুনায় কন্টেন্টকন্ট্রোলটি উপস্থাপক সামগ্রী সহ কী করতে হবে তা নির্ধারণ করে।


1

কখনও কখনও একটি উদাহরণ তাত্ত্বিক জারগনের চেয়ে সহজ। একটি এমএস ওয়েব সাইটে (নীচে স্ক্রোল করুন: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx ) হিসাবে এটি একটি বোতামটি ব্যবহার করে একটি উদাহরণ. একটি বোতামের একটি কন্টেন্টকন্ট্রোল রয়েছে, যা আপনাকে একটি নিয়ন্ত্রণ বা একটি কাস্টম নিয়ন্ত্রণ স্থাপন করতে দেয় যা কোনও চিত্র, পাঠ্য, চেকবক্স, স্ট্যাকপ্যানেল, গ্রিড যাই হোক না কেন হতে পারে।

বোতামের কাস্টমাইজেশনের পরে, এখন এক্সএমেলে, আপনি লিখতে পারেন

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

উপরের উদাহরণ কোডে, "আমার: বাটন.সন্টেন্ট" হ'ল কনটেন্ট কন্ট্রোল। অনিয়ন্ত্রকটি কন্টেন্টপ্রেসেন্টার যেখানে রয়েছে তা আপনি নির্দিষ্ট করেছেন to

একইভাবে, যখন টেক্সটবক্স এবং টেক্সটব্লকের সাথে তুলনা করা হয়, তখন টেক্সটবক্সের উপরের বোতামের উদাহরণের মতো টেক্সটবক্সের মধ্যে সামগ্রী স্টাফ করার জন্য একটি বিষয়বস্তু রয়েছে whereas একটি টেক্সটব্লক কেবল আপনাকে পাঠ্য প্রবেশ করতে দেয়।


2
একটি Buttonনয় আছে একটি [ ContentControl] (msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (উ = vs.110) .aspx), এটা একটি হল (উত্তরাধিকারী থেকে) ContentControlButton হয়েছে একটি ContentPresenter। নোট করুন যে আপনি এটি স্ট্যান্ডার্ডের সাথে করতে পারেন Button, এটি কাস্টমাইজ করার দরকার নেই।
বা ম্যাপার

কিন্তু যে অসম্পর্কিত, এই উত্তর ব্যাখ্যা না কিনা এবং কেন, পরিবর্তে ContentPresenter, একটি ContentControlঠিক যেমন ভাল ব্যবহার করা যেতে পারে ControlTemplateবিষয়বস্তুর প্রদর্শন করে Button। যেমন, এটি প্রশ্নের উত্তর দেয় না।
বা ম্যাপার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.