একটি নিয়ন্ত্রণের কনস্ট্রাক্টর থেকে ডিজাইন মোড সনাক্ত করা


101

এই প্রশ্নটি অনুসরণ করে , কোনও কি কোনও অবজেক্টের কনস্ট্রাক্টরের মধ্যে থেকে ডিজাইন বা রানটাইম মোডে রয়েছে কিনা তা সনাক্ত করা সম্ভব?

আমি বুঝতে পারি যে এটি সম্ভব নাও হতে পারে এবং আমি যা চাই তা পরিবর্তন করতে হবে তবে আপাতত আমি এই নির্দিষ্ট প্রশ্নে আগ্রহী।

উত্তর:


194

আপনি নেমস্পেসে লাইসেন্স ইউজেজমড গণনা ব্যবহার করতে পারেন System.ComponentModel:

bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);

4
মার্জিত সমাধান, এটি সি # কার্যকারিতা থেকে আরও ভাল কাজ করে ISite.DesignMode
56ka

10
@ ফিলিপ কুনক: যদি এটি অনপেন্টে কাজ না করে তবে আপনি এই শর্তটি নির্মাতায় পরীক্ষা করতে পারেন এবং এটি কোনও শ্রেণির ক্ষেত্রে সংরক্ষণ করতে পারেন।
আইভিল

4
কোনও ব্যবহারকারী নিয়ন্ত্রণে ডাব্ল্যান্ডড্রোককে ওভাররাইড করার সময়ও এটি কাজ করে না। @ আইমিল পরামর্শটি ব্যবহার করতে হবে
ম্যাট

4
এটি নির্মাণে স্থাপন করা একটি দুর্দান্ত ধারণা আইমিল, এটি আমার পক্ষে কাজ করেছে .. আমি এটি একটি স্ট্যাটিক ক্লাস ফিল্ডে রাখার চেষ্টা করেছি, তবে (আমি মনে করি) স্ট্যাটিক ক্লাস ফিল্ডগুলি যখন আপনি প্রথম ডাকলেন তখন শুরু হয়েছিল, তাই নিরাপদ সমাধান নয় ...
ইব্রাহিম ওজডেমির

23

আপনি কি এরকম কিছু খুঁজছেন:

public static bool IsInDesignMode()
{
    if (Application.ExecutablePath.IndexOf("devenv.exe", StringComparison.OrdinalIgnoreCase) > -1)
    {
        return true;
    }
    return false;
}

আপনি প্রক্রিয়া নাম পরীক্ষা করে এটি করতে পারেন:

if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")
   return true;

4
অনপেইন্টে কাজ করা, উত্পন্ন ক্লাস, নির্মাতা ইত্যাদি সর্বোত্তম সমাধান এখনও।
ফিলিপ কঙ্ক

14
আইএমএইচও, এটি দেখতে কুৎসিত সমাধানের মতো।
ক্যামিলো মার্টিন

5
মনোযোগ এখানে সম্ভব মেমরি ফাঁস। প্রক্রিয়া নিষ্পত্তি করতে হবে।
এলোমেলোভাবে

7
যদিও আমি নিশ্চিত যে এটি বেশিরভাগ ব্যবহারের ক্ষেত্রে ঠিকঠাক কাজ করবে তবে এই সমাধানটির একটি প্রধান ত্রুটি রয়েছে: ভিজ্যুয়াল স্টুডিও হ'ল (অন্তত তত্ত্বের ক্ষেত্রে) একমাত্র ডিজাইনার হোস্ট নয়। অতএব, এই সমাধানটি কেবল তখনই কাজ করবে যদি আপনার ডিজাইনার নামক একটি অ্যাপ্লিকেশন দ্বারা হোস্ট করা হয় devenv
stakx -

4
বর্তমানে গৃহীত উত্তরের মতো নয়, ভিএস ২০১৩ এ কাজ করে।
মবি ডিস্ক

9

উপাদান ... যতদূর আমি জানি ডিজাইনমোড সম্পত্তি নেই। এই সম্পত্তি নিয়ন্ত্রণ দ্বারা সরবরাহ করা হয়। তবে সমস্যাটি যখন কাস্টমকন্ট্রোল ডিজাইনারের কোনও ফর্মের মধ্যে থাকে তখন এই কাস্টমকন্ট্রোলটি রানটাইম মোডে চলছে।

আমি অভিজ্ঞতা পেয়েছি যে ডিজাইনমোড সম্পত্তিটি কেবল ফর্মটিতে সঠিকভাবে কাজ করে।


টিপ জন্য ধন্যবাদ! আমি এর আগে কখনই বুঝতে পারি নি, তবে এটি সঠিক ধারণা দেয়। অ্যাড্রিয়ানব্যাঙ্কস দ্বারা সরবরাহ করা লাইসেন্সম্যানেজার পদ্ধতি ব্যবহার করা এই ক্ষেত্রে নিখুঁতভাবে কাজ করে, যেখানে নিয়ন্ত্রণটি অন্য নিয়ন্ত্রণ / আকারে এম্বেড থাকে। প্রতিটি জন্য +1!
জোশ স্ট্রিলিং

4
+1 আপনি একেবারে ঠিক বলেছেন, এটি আমার অভিজ্ঞতাও ছিল। আপনি যখন কোনও ফর্মের উপর একটি ব্যবহারকারী নিয়ন্ত্রণ স্থাপন করবেন, যদি কোনও মাউসেন্টার বা লোড ইভেন্ট থাকে তবে ডিজাইনমোড এখনও মিথ্যা হিসাবে উপস্থিত হবে কারণ আপনি এই নিয়ন্ত্রণের জন্য ডিজাইনমডে নেই। আমার অভিজ্ঞতায় এটি ভিজ্যুয়াল স্টুডিওর বেশ শক্তভাবে ক্র্যাশ করে।
কাইল বি

8

নিয়ন্ত্রণগুলি (ফর্ম, ব্যবহারকারী নিয়ন্ত্রণসমূহ ইত্যাদি) উত্তরাধিকার সূত্রে প্রাপ্ত Component classযা bool property DesignMode:

if(DesignMode)
{
  //If in design mode
}

4
কোনটি কনস্ট্রাক্টর চলাকালীন সেট করে না, ওরফে ওপির প্রাথমিক ইস্যু। প্রথম মুহূর্তে আপনি এটি ব্যবহার করতে পারেন OnHandleCreated
রায়

8

গুরুত্বপূর্ণ

উইন্ডোজ ফর্ম বা ডাব্লুপিএফ ব্যবহারের পার্থক্য আছে !!

তাদের বিভিন্ন ডিজাইনার রয়েছে এবং তাদের বিভিন্ন চেক প্রয়োজন । আপনি যখন ফর্ম এবং ডাব্লুপিএফ নিয়ন্ত্রণগুলি মিশ্রিত করেন তবে অতিরিক্ত এটি মুশকিল। (যেমন ডাব্লুপিএফ একটি ফর্ম উইন্ডোর ভিতরে নিয়ন্ত্রণ করে)

যদি আপনার কেবল উইন্ডোজ ফর্ম থাকে তবে এটি ব্যবহার করুন:

Boolean isInWpfDesignerMode   = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);

আপনার যদি কেবল ডাব্লুপিএফ থাকে তবে এই চেকটি ব্যবহার করুন:

Boolean isInFormsDesignerMode = (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv");

আপনার যদি ফর্ম এবং ডাব্লুপিএফের মিশ্র ব্যবহার থাকে তবে এই জাতীয় চেক ব্যবহার করুন:

Boolean isInWpfDesignerMode   = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
Boolean isInFormsDesignerMode = (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv");

if (isInWpfDesignerMode || isInFormsDesignerMode)
{
    // is in any designer mode
}
else
{
    // not in designer mode
}

বর্তমান মোডটি দেখতে আপনি ডিবাগিংয়ের জন্য একটি বার্তাবক্স প্রদর্শন করতে পারেন:

// show current mode
MessageBox.Show(String.Format("DESIGNER CHECK:  WPF = {0}   Forms = {1}", isInWpfDesignerMode, isInFormsDesignerMode));

মন্তব্য:

আপনাকে নেমস্পেসস সিস্টেম যুক্ত করতে হবে omp কম্পোনেন্টমোডেল এবং সিস্টেম D ডায়াগনস্টিক্স


আমি মনে করি আপনার নামকরণ বিভ্রান্তিকর। উইনফোর্মে ব্যবহার করার সময় নামকরণটি হ'ল 'isInWpfDesignerMode' এবং WPF- এর জন্য এটি 'isInformsDesignerMode'
এম স্টোরজেল

5

আপনার কম্পোনেন্ট.ডিজাইনমড সম্পত্তি ব্যবহার করা উচিত। আমি যতদূর জানি, এটি কোনও নির্মাণকারীর কাছ থেকে ব্যবহার করা উচিত নয়।


7
আপনার নিয়ন্ত্রণ যখন অন্য কোনও নিয়ন্ত্রণ বা ফর্মের নকশা করা হচ্ছে তখন এটি কাজ করে না।
এরিক

4
আসলে এটি আমার উপাদানগুলিতে বেশ ভাল কাজ করে। if (!DesignMode)ডিজাইনের সময়টি স্প্যাম না করে তা নিশ্চিত করার জন্য আমাকে সর্বদা অনপেন্ট পদ্ধতিতে যুক্ত করতে হয়েছিল।
বিটারব্লু

4

আরেকটি আকর্ষণীয় পদ্ধতি যা ব্লগে বর্ণনা করা হয়েছে: http://www.undermyhat.org/blog/2009/07/in-depth-a-definitive-guide-to-net-user-controls-usage-mode-designmode-or -উজারমোড /

মূলত, এটি নির্বাহী অ্যাসেম্বলি থেকে প্রবেশের অ্যাসেম্বলি থেকে স্থিরভাবে রেফারেন্স হওয়ার জন্য পরীক্ষা করে। এটি সমাবেশ নাম ('devenv.exe', 'monodevelop.exe' ..) ট্র্যাক করার প্রয়োজনীয়তাকে বাধা দেয়।

তবে এটি অন্যান্য সমস্ত দৃশ্যে কাজ করে না, যেখানে সমাবেশটি গতিশীলভাবে লোড করা হয় (ভিএসটিও হ'ল একটি উদাহরণ)।


লিঙ্কটি (কার্যকরভাবে) নষ্ট হয়ে গেছে। এটি পরিবর্তে সর্বশেষতম ব্লগ পোস্টে (বর্তমানে 2016-03) পুনর্নির্দেশ করে।
পিটার মর্টেনসেন


2

ডিজাইনারের সহযোগিতায় ... এটি নিয়ন্ত্রণে, উপাদানগুলিতে, সমস্ত জায়গায় ব্যবহার করা যেতে পারে

    private bool getDesignMode()
    {
        IDesignerHost host;
        if (Site != null)
        {
            host = Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
            if (host != null)
            {
                if (host.RootComponent.Site.DesignMode) MessageBox.Show("Design Mode");
                else MessageBox.Show("Runtime Mode");
                return host.RootComponent.Site.DesignMode;
            }
        }
        MessageBox.Show("Runtime Mode");
        return false;
    }

MessageBox.Show(লাইনগুলি সরানো উচিত। এটি কেবলমাত্র এটি সঠিকভাবে কাজ করে তা নিশ্চিত করে।


1

আমি আমার প্রকল্পে এই পদ্ধতিটি ব্যবহার করেছি:

//use a Property or Field for keeping the info to avoid runtime computation
public static bool NotInDesignMode { get; } = IsNotInDesignMode();
private static bool IsNotInDesignMode()
{
    /*
    File.WriteAllLines(@"D:\1.log", new[]
    {
        LicenseManager.UsageMode.ToString(), //not always reliable, e.g. WPF app in Blend this will return RunTime
        Process.GetCurrentProcess().ProcessName, //filename without extension
        Process.GetCurrentProcess().MainModule.FileName, //full path
        Process.GetCurrentProcess().MainModule.ModuleName, //filename
        Assembly.GetEntryAssembly()?.Location, //null for WinForms app in VS IDE
        Assembly.GetEntryAssembly()?.ToString(), //null for WinForms app in VS IDE
        Assembly.GetExecutingAssembly().Location, //always return your project's output assembly info
        Assembly.GetExecutingAssembly().ToString(), //always return your project's output assembly info
    });
    //*/

    //LicenseManager.UsageMode will return RunTime if LicenseManager.context is not present.
    //So you can not return true by judging it's value is RunTime.
    if (LicenseUsageMode.Designtime == LicenseManager.UsageMode) return false;
    var procName = Process.GetCurrentProcess().ProcessName.ToLower();
    return "devenv" != procName //WinForms app in VS IDE
        && "xdesproc" != procName //WPF app in VS IDE/Blend
        && "blend" != procName //WinForms app in Blend
        //other IDE's process name if you detected by log from above
        ;
}

মনোযোগ দিন !!!: কোডটি ফেরত কোডটি ডিজাইন মোডে নির্দেশ করছে না !


0

লাইসেন্সপঞ্জী সমাধান অনপেন্টের অভ্যন্তরে কাজ করে না, এটিও করে না es ডিজাইনমোড। আমি @ জারেকের মতো একই সমাধানটি পেয়েছি।

এখানে ক্যাশেড সংস্করণ:

    private static bool? isDesignMode;
    private static bool IsDesignMode()
    {
        if (isDesignMode == null)
            isDesignMode = (Process.GetCurrentProcess().ProcessName.ToLower().Contains("devenv"));

        return isDesignMode.Value;
    }

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


0

আপনি যদি ভিজুয়াল স্টুডিও ডিজাইনারে না চলতে চলতে কিছু লাইন চালাতে চান তবে আপনার ডিজাইনমোড সম্পত্তিটি নীচে প্রয়োগ করা উচিত:

// this code is in the Load of my UserControl
if (this.DesignMode == false)
{
    // This will only run in run time, not in the designer.
    this.getUserTypes();
    this.getWarehouses();
    this.getCompanies();
}

0
    private void CtrlSearcher_Load(object sender, EventArgs e)
    {
           if(!this.DesignMode) InitCombos();
    }

যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
টিয়াগো মার্টিনস পেরেস

0

কাস্টম / ব্যবহারকারীর নিয়ন্ত্রণ ব্যবহার করার সময় ডিফল্টরূপে সক্ষম টাইমারগুলি ক্রাশের কারণ হতে পারে। এগুলি ডিফল্টরূপে অক্ষম করুন এবং কেবল ডিজাইন মোড চেকের পরে সক্ষম করুন

   public chartAdapter()
    {
        try
        {

            //Initialize components come here
            InitializeComponent();

            //Design mode check
            bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
            if (designMode)
                return;

            //Enable timers ONLY after designmode check, or else crash
            timerAutoConnect.Enabled = timerDraw.Enabled = true;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.