ডাব্লুপিএফ-তে স্ট্যাটিক রিসোর্স এবং ডায়নামিক রিসোর্সের মধ্যে পার্থক্য কী?


473

ডাব্লুপিএফ-তে ব্রাশ, টেম্পলেট এবং শৈলীর মতো সংস্থানগুলি ব্যবহার করার সময় সেগুলিকে স্ট্যাটিক রিসোর্স হিসাবে নির্দিষ্ট করা যায়

<Rectangle Fill="{StaticResource MyBrush}" />

বা ডায়নামিক রিসোর্স হিসাবে

<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}"  />

বেশিরভাগ সময় (সর্বদা?), কেবল একটি কাজ করে এবং অন্যটি রানটাইমের সময় ব্যতিক্রম করবে। তবে আমি জানতে চাই কেন:

  • মূল পার্থক্য কি। মেমরি বা পারফরম্যান্সের ইমপ্লিকেশনগুলির মতো
  • "ব্রাশ সবসময় স্থির" এবং "টেমপ্লেটগুলি সর্বদা গতিশীল থাকে" ইত্যাদি ডাব্লুপিএফ-তে কোনও নিয়ম আছে কি?

আমি ধরে নিয়েছি স্ট্যাটিক বনাম ডায়নামিকের মধ্যে পছন্দটি যতটা স্বেচ্ছাসেবীর মতো মনে হয় না ... তবে আমি প্যাটার্নটি দেখতে ব্যর্থ হই।


27
এটি লক্ষণীয় গুরুত্বপূর্ণ যে উইন্ডোজ 8 অ্যাপ বিকাশকারীদের একটি বিকল্প হিসাবে ডায়ানমিক রিসোর্স নেই, কেবল স্ট্যাটিক রিসোর্স।
জেরি নিকসন

2
@ জেরি নিকসন এর জন্য Thankশ্বরের ধন্যবাদ, আমি স্ট্যাটিক রিসোর্সের পরিবর্তে ডায়নামিক রিসোর্স, বা তদ্বিপরীত ব্যবহার করার কারণে আমি যে পরিমাণ কাজ করতে পারি তার সংখ্যা গণনা হারিয়ে ফেলেছি। প্রোগ্রামার দৃষ্টিকোণ থেকে, এটি অপ্রয়োজনীয় জটিলতা। একটি সাদৃশ্যটি পরিবর্তনশীল সংজ্ঞা, আমাকে কী স্পষ্ট করে তা উল্লেখ করতে হবে যে এটি গাদা বা স্ট্যাকের উপরে থাকে? এবং যদি আমি এটির ভুল বুঝতে পারি তবে এটি একটি বিপর্যয়কর রানটাইম ত্রুটি ছুঁড়ে দেয়?
কনটাঙ্গো

StaticResource এবং DynamicResource, এবং যখন প্রতিটি ব্যবহার করতে একটি পুঙ্খানুপুঙ্খ ব্যাখ্যার জন্য দেখুন msdn.microsoft.com/en-us/library/ms750613%28v=vs.100%29.aspx
মাইকেল রেপুচি

উত্তর:


466

এক্সটিএলএল লোডিংয়ের সময় একটি স্ট্যাটিক রিসোর্স সমাধান করা হবে এবং অ্যাপ্লিকেশনটি চালুর আগে ঘটে যাওয়া এক্সএএমএল লোডিংয়ের সময় সম্পত্তিটিকে অর্পণ করা হবে। এটি কেবল একবার বরাদ্দ করা হবে এবং উত্স অভিধানে যে কোনও পরিবর্তন উপেক্ষা করা হবে।

একটি ডায়নামিক রিসোর্স লোডিংয়ের সময় সম্পত্তিটিতে একটি এক্সপ্রেশন অবজেক্ট বরাদ্দ করে তবে এক্সপ্রেশন অবজেক্টটির মান জিজ্ঞাসা করা হলে রানটাইম হওয়া পর্যন্ত বাস্তবে রিসোর্সটি অনুসন্ধান করে না। এটি রানটাইমটিতে প্রয়োজনীয় হওয়া অবধি রিসোর্সটি সন্ধান করে। এক্সএএমএল-এ পরে সংজ্ঞায়িত সংস্থানটির একটি উত্তম উদাহরণ হতে পারে। আর একটি উদাহরণ এমন একটি সংস্থান যা রানটাইম পর্যন্ত অবধি থাকবে না। উত্স উত্স অভিধানের পরিবর্তন করা থাকলে এটি লক্ষ্য আপডেট করে।


4
ডায়নামিকআরসোর্স ব্যবহার করার আগে আমার কী পরিবর্তন করতে হবে? উদাহরণস্বরূপ কোনও টেম্পলেট নিন: আমি এটি একবার সংজ্ঞায়িত করি তবে অবশ্যই ট্রিগার এবং স্টাফ টেম্পলেটটির সামগ্রী পরিবর্তন করতে পারে তবে টেমপ্লেটটি এখনও একই। স্ট্যাটিক রিসোর্স এখানে কি করবে?
ইসাক সাভো

5
স্ট্যাটিক রিসোর্স ব্যবহার করুন যদি আপনি সংযুক্ত করছেন যে সংস্থানটি এর এক্সাম ব্যবহারের আগে এক্সএএমএল-তে সংজ্ঞায়িত করা হয়েছে এবং প্রয়োগকালের আজীবন পরিবর্তন হতে চলেছে না। সেক্ষেত্রে আপনি স্ট্যাটিক রিসোর্স দিয়ে আরও ভাল পারফরম্যান্স পাবেন।
ফিল রাইট

4
এই দুটিয়ের ক্ষেত্রে কী দ্বিপাক্ষিক বাধ্যবাধকতা প্রযোজ্য, যদি হ্যাঁ তবে সেই ক্ষেত্রে তফাত কী হবে?
WhoIsNinja

11
শেষ বাক্যটি সত্যই গুরুত্বপূর্ণ:It will update the target if the source resource dictionary is changed.
মেমার্ক

4
@ ইসাকস্যাভো রঙিন থিমযুক্ত একটি ইউআই বিবেচনা করুন, একটি গতিশীল সংস্থান সহ, আপনি অন্য অভিধানের জন্য একটি অভিধান অদলবদল করতে পারেন এবং নতুন অভিধানে উল্লেখযোগ্য সংস্থানগুলি যে কোনও কিছুই স্বয়ংক্রিয়ভাবে আপডেট হবে।
গুসডোর

119

আমি তাদের সম্পর্কে বিভ্রান্তও ছিলাম। নীচে এই উদাহরণটি দেখুন:

<Window x:Class="WpfApplicationWPF.CommandsWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="CommandsWindow" Height="300" Width="300">

    <StackPanel>
        <Button Name="ButtonNew" 
                Click="ButtonNew_Click" 
                Background="{DynamicResource PinkBrush}">NEW</Button>
        <Image Name="ImageNew" 
               Source="pack://application:,,,/images/winter.jpg"></Image>
    </StackPanel>


    <Window.Background>
        <DynamicResource ResourceKey="PinkBrush"></DynamicResource>
    </Window.Background>

</Window>

এখানে আমি বোতাম এবং উইন্ডোটির জন্য গতিশীল সংস্থান ব্যবহার করেছি এবং এটি কোথাও ঘোষণা করি নি U রান রানটাইমের পরে, স্তরক্রমের রিসোর্সডোরিয়রিয়ানটি চেক করা হবে ince যেহেতু আমি এটি সংজ্ঞায়িত না করেছি, অনুমান করি ডিফল্টটি ব্যবহৃত হবে।

আমি যদি বোতামের ইভেন্টটি ক্লিক করতে নীচের কোডটি যুক্ত করি, যেহেতু তারা ডায়নামিক রিসোর্স ব্যবহার করে, পটভূমি সেই অনুযায়ী আপডেট করা হবে।

private void ButtonNew_Click(object sender, RoutedEventArgs e)
{
    this.Resources.Add(  "PinkBrush"
                         ,new SolidColorBrush(SystemColors.DesktopColor)
                       );
}

যদি তারা স্ট্যাটিক রিসোর্স ব্যবহার করে থাকে:

  • এক্সএএমএল-তে সংস্থানটি ঘোষণা করতে হবে
  • এবং এটিও "আগে" তারা ব্যবহৃত হয়।

আশা করি আমি কিছু বিভ্রান্তি দূর করেছি।


31

স্ট্যাটিক রিসোর্সটি অবজেক্ট নির্মাণে সমাধান করা হবে।
ডায়নামিক রিসোর্স মূল্যায়ন করা হবে এবং প্রতিবার নিয়ন্ত্রণের জন্য সংস্থান দরকার হবে resolved


21
  1. স্ট্যাটিক রিসোর্স প্রথম মান ব্যবহার করে । ডায়নামিক রিসোর্স শেষ মানটি ব্যবহার করে ।
  2. ডায়নামিক রিসোর্স নেস্টেড স্টাইলিংয়ের জন্য ব্যবহার করা যেতে পারে, স্ট্যাটিক রিসোর্স পারে না।

মনে করুন আপনার কাছে এই নেস্টেড স্টাইলের অভিধান রয়েছে। লাইটগ্রিন মূল স্তরে থাকে যখন একটি গ্রিডের ভিতরে গোলাপী বাসা বেঁধে থাকে।

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Grid}">
        <Style.Resources>
            <Style TargetType="{x:Type Button}" x:Key="ConflictButton">
                <Setter Property="Background" Value="Pink"/>
            </Style>
        </Style.Resources>
    </Style>
    <Style TargetType="{x:Type Button}" x:Key="ConflictButton">
        <Setter Property="Background" Value="LightGreen"/>
    </Style>
</ResourceDictionary>

দেখুন:

<Window x:Class="WpfStyleDemo.ConflictingStyleWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ConflictingStyleWindow" Height="100" Width="100">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles/ConflictingStyle.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Button Style="{DynamicResource ConflictButton}" Content="Test"/>
    </Grid>
</Window>

স্ট্যাটিক রিসোর্সটি লাইটগ্রিন হিসাবে বোতামটি রেন্ডার করবে, এটি শৈলীতে পাওয়া প্রথম মান। ডায়ামিকআরসোর্স গ্রিডটি রেন্ডার করে লাইটগ্রিন বোতামটিকে গোলাপী হিসাবে ওভাররাইড করবে।

StaticResource StaticResource

DynamicResource DynamicResource

মনে রাখবেন যে ভিএস ডিজাইনার ডায়নামিক রিসোর্সকে স্ট্যাটিক রিসোর্স হিসাবে বিবেচনা করে। এটি প্রথম মান পাবে। এই ক্ষেত্রে, ভিএস ডিজাইনার লাইটগ্রিন হিসাবে বোতামটি রেন্ডার করবে যদিও এটি আসলে গোলাপী হিসাবে শেষ হয়।

রুট-লেভেল স্টাইল (লাইটগ্রিন) সরানো হলে স্ট্যাটিক রিসোর্স একটি ত্রুটি ফেলবে।


13

মূল পার্থক্য কি। মেমরি বা পারফরম্যান্সের ইমপ্লিকেশনগুলির মতো

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

স্থিতিশীল সংস্থানগুলি একবারে উপাদানকে রেফারেন্স করে পুনরুদ্ধার করা হয় এবং সম্পদের আজীবন ব্যবহৃত হয়। অন্যদিকে, ডায়নামিক রিসোর্সগুলি যতবার ব্যবহৃত হয় ততবার পুনরুদ্ধার করে।

ডায়নামিক সংস্থানগুলির নেতিবাচক দিকটি হ'ল তারা অ্যাপ্লিকেশন কর্মক্ষমতা হ্রাস করার ঝোঁক।

"ব্রাশ সবসময় স্থির" এবং "টেমপ্লেটগুলি সর্বদা গতিশীল থাকে" ইত্যাদি ডাব্লুপিএফ-তে কোনও নিয়ম আছে কি?

সর্বোত্তম অনুশীলন হ'ল স্ট্যাটিক রিসোর্স ব্যবহার করা যদি না আপনার মতো নির্দিষ্ট কারণ না থাকে তবে আপনি গতিবেগের পিছনে কোডটিতে সংস্থান পরিবর্তন করতে চান। উদাহরণস্বরূপের আরও একটি উদাহরণ যেখানে আপনি সিস্টেম ব্রাশস, সিস্টেনফন্ট এবং সিস্টেম প্যারামিটারগুলি ব্যবহার করার সময় ডায়নামিক রিসোর্সগুলি ব্যবহার করতে চাইবেন না।


7

সমস্ত উত্তর দরকারী খুঁজে পেয়েছে, শুধু আরও একটি ব্যবহারের কেস যুক্ত করতে চেয়েছিলেন।

একটি যৌগিক ডাব্লুপিএফ দৃশ্যে আপনার ব্যবহারকারীর নিয়ন্ত্রণটি সেই সংস্থানটিকে ডায়নামিক রিসোর্স হিসাবে উল্লেখ করে অন্য যে কোনও প্যারেন্ট উইন্ডো / নিয়ন্ত্রণে সংজ্ঞায়িত সংস্থানগুলি ব্যবহার করতে পারে (যা এই ব্যবহারকারী নিয়ন্ত্রণটি হোস্ট করবে))

অন্যদের দ্বারা উল্লিখিত হিসাবে, স্ট্যাটিক্রেসোর্স সংকলনের সময় সন্ধান করা হবে। ব্যবহারকারী নিয়ন্ত্রণগুলি সেই সংস্থানগুলিকে উল্লেখ করতে পারে না যা হোস্টিং / পিতামাতার নিয়ন্ত্রণে সংজ্ঞায়িত হয়। যদিও, ডায়নামিক রিসোর্স এই ক্ষেত্রে ব্যবহার করা যেতে পারে।


3

গতিশীল সংস্থানগুলির গুরুত্বপূর্ণ সুবিধা

যদি অ্যাপ্লিকেশন স্টার্টআপটি খুব দীর্ঘ সময় নেয়, আপনার অবশ্যই গতিশীল সংস্থানগুলি ব্যবহার করতে হবে, কারণ উইন্ডো বা অ্যাপ তৈরি হওয়ার সময় স্থিতিশীল সংস্থানগুলি সর্বদা লোড হয়, যখন গতিশীল সংস্থানগুলি প্রথম ব্যবহৃত হয় তখন লোড হয়।

তবে আপনার উত্সটি অত্যন্ত বড় এবং জটিল না হলে আপনি কোনও লাভ দেখতে পাবেন না।


ডায়নামিক রিসোর্সগুলির জন্য, এটি কেবল একবার (প্রথমবারের জন্য ব্যবহৃত) কোনও পারফরম্যান্স ইস্যু তৈরি করছে বা প্রতিবার এটি উপাদান ব্যবহার করা হচ্ছে?
মরগানে

এক্ষেত্রে সর্বাধিক ব্যবহৃত ক্ষেত্রগুলি অবশ্যই স্থিতিশীল সংস্থান হতে হবে, কাস্টম ব্যবহৃত ক্ষেত্রগুলি গতিশীল হতে পারে, যেমন মূল উইন্ডোয়ের জন্য সম্পদ স্থির হয় এবং ডায়লগ উইন্ডো সংস্থানটি গতিশীল হতে পারে
জামালদার

2

ডায়নামিক রিসোর্স কেবল তখনই ব্যবহৃত হতে পারে যখন সম্পত্তি সেট করা থাকে এমন অবজেক্টে থাকে যা নির্ভরতা অবজেক্ট বা হিমায়িত থেকে প্রাপ্ত হয় যেখানে স্থির সংস্থান হিসাবে যে কোনও জায়গায় ব্যবহার করা যায়। আপনি স্থিতিশীল সংস্থান ব্যবহার করে পুরো নিয়ন্ত্রণ দূরে রাখতে পারেন।

স্থিতিশীল সংস্থানগুলি নিম্নলিখিত পরিস্থিতিতে ব্যবহার করা হয়:

  1. যখন রানটাইমের সময় প্রতিক্রিয়া সংস্থান পরিবর্তন করা প্রয়োজন হয় না।
  2. আপনার যদি প্রচুর সংস্থান সহ ভাল পারফরম্যান্সের প্রয়োজন হয়।
  3. একই অভিধানে রিসোর্সগুলি রেফারেন্স করার সময়।

গতিশীল সংস্থানসমূহ:

  1. সম্পত্তি বা স্টাইল সেটার থিমের মান রানটাইম পর্যন্ত জানা যায় না
    • এর মধ্যে রয়েছে সিস্টেম, অ্যাপ্লিকেশন, থিম ভিত্তিক সেটিংস
    • এর মধ্যে ফরোয়ার্ড রেফারেন্সও অন্তর্ভুক্ত রয়েছে।
  2. পৃষ্ঠাগুলি, উইন্ডো, ব্যবহারকারী নিয়ন্ত্রণের লোড হলে লোড না হতে পারে এমন বড় সংস্থানগুলি উল্লেখ করে।
  3. একটি কাস্টম নিয়ন্ত্রণে থিম শৈলীর উল্লেখ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.