এই প্রশ্নটি অনুসরণ করে , কোনও কি কোনও অবজেক্টের কনস্ট্রাক্টরের মধ্যে থেকে ডিজাইন বা রানটাইম মোডে রয়েছে কিনা তা সনাক্ত করা সম্ভব?
আমি বুঝতে পারি যে এটি সম্ভব নাও হতে পারে এবং আমি যা চাই তা পরিবর্তন করতে হবে তবে আপাতত আমি এই নির্দিষ্ট প্রশ্নে আগ্রহী।
এই প্রশ্নটি অনুসরণ করে , কোনও কি কোনও অবজেক্টের কনস্ট্রাক্টরের মধ্যে থেকে ডিজাইন বা রানটাইম মোডে রয়েছে কিনা তা সনাক্ত করা সম্ভব?
আমি বুঝতে পারি যে এটি সম্ভব নাও হতে পারে এবং আমি যা চাই তা পরিবর্তন করতে হবে তবে আপাতত আমি এই নির্দিষ্ট প্রশ্নে আগ্রহী।
উত্তর:
আপনি নেমস্পেসে লাইসেন্স ইউজেজমড গণনা ব্যবহার করতে পারেন System.ComponentModel:
bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
আপনি কি এরকম কিছু খুঁজছেন:
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;
devenv।
উপাদান ... যতদূর আমি জানি ডিজাইনমোড সম্পত্তি নেই। এই সম্পত্তি নিয়ন্ত্রণ দ্বারা সরবরাহ করা হয়। তবে সমস্যাটি যখন কাস্টমকন্ট্রোল ডিজাইনারের কোনও ফর্মের মধ্যে থাকে তখন এই কাস্টমকন্ট্রোলটি রানটাইম মোডে চলছে।
আমি অভিজ্ঞতা পেয়েছি যে ডিজাইনমোড সম্পত্তিটি কেবল ফর্মটিতে সঠিকভাবে কাজ করে।
নিয়ন্ত্রণগুলি (ফর্ম, ব্যবহারকারী নিয়ন্ত্রণসমূহ ইত্যাদি) উত্তরাধিকার সূত্রে প্রাপ্ত Component classযা bool property DesignMode:
if(DesignMode)
{
//If in design mode
}
OnHandleCreated।
গুরুত্বপূর্ণ
উইন্ডোজ ফর্ম বা ডাব্লুপিএফ ব্যবহারের পার্থক্য আছে !!
তাদের বিভিন্ন ডিজাইনার রয়েছে এবং তাদের বিভিন্ন চেক প্রয়োজন । আপনি যখন ফর্ম এবং ডাব্লুপিএফ নিয়ন্ত্রণগুলি মিশ্রিত করেন তবে অতিরিক্ত এটি মুশকিল। (যেমন ডাব্লুপিএফ একটি ফর্ম উইন্ডোর ভিতরে নিয়ন্ত্রণ করে)
যদি আপনার কেবল উইন্ডোজ ফর্ম থাকে তবে এটি ব্যবহার করুন:
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 ডায়াগনস্টিক্স ।
আপনার কম্পোনেন্ট.ডিজাইনমড সম্পত্তি ব্যবহার করা উচিত। আমি যতদূর জানি, এটি কোনও নির্মাণকারীর কাছ থেকে ব্যবহার করা উচিত নয়।
if (!DesignMode)ডিজাইনের সময়টি স্প্যাম না করে তা নিশ্চিত করার জন্য আমাকে সর্বদা অনপেন্ট পদ্ধতিতে যুক্ত করতে হয়েছিল।
আরেকটি আকর্ষণীয় পদ্ধতি যা ব্লগে বর্ণনা করা হয়েছে: http://www.undermyhat.org/blog/2009/07/in-depth-a-definitive-guide-to-net-user-controls-usage-mode-designmode-or -উজারমোড /
মূলত, এটি নির্বাহী অ্যাসেম্বলি থেকে প্রবেশের অ্যাসেম্বলি থেকে স্থিরভাবে রেফারেন্স হওয়ার জন্য পরীক্ষা করে। এটি সমাবেশ নাম ('devenv.exe', 'monodevelop.exe' ..) ট্র্যাক করার প্রয়োজনীয়তাকে বাধা দেয়।
তবে এটি অন্যান্য সমস্ত দৃশ্যে কাজ করে না, যেখানে সমাবেশটি গতিশীলভাবে লোড করা হয় (ভিএসটিও হ'ল একটি উদাহরণ)।
আপনি এটি ব্যবহার করতে পারেন
if (DesignerProperties.GetIsInDesignMode(this))
{
...
}
ডিজাইনারের সহযোগিতায় ... এটি নিয়ন্ত্রণে, উপাদানগুলিতে, সমস্ত জায়গায় ব্যবহার করা যেতে পারে
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(লাইনগুলি সরানো উচিত। এটি কেবলমাত্র এটি সঠিকভাবে কাজ করে তা নিশ্চিত করে।
আমি আমার প্রকল্পে এই পদ্ধতিটি ব্যবহার করেছি:
//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
;
}
মনোযোগ দিন !!!: কোডটি ফেরত কোডটি ডিজাইন মোডে নির্দেশ করছে না !
লাইসেন্সপঞ্জী সমাধান অনপেন্টের অভ্যন্তরে কাজ করে না, এটিও করে না es ডিজাইনমোড। আমি @ জারেকের মতো একই সমাধানটি পেয়েছি।
এখানে ক্যাশেড সংস্করণ:
private static bool? isDesignMode;
private static bool IsDesignMode()
{
if (isDesignMode == null)
isDesignMode = (Process.GetCurrentProcess().ProcessName.ToLower().Contains("devenv"));
return isDesignMode.Value;
}
আপনি যদি কোনও তৃতীয় পক্ষের আইডিই ব্যবহার করেন বা মাইক্রোসফ্ট (বা আপনার শেষ ব্যবহারকারী) যদি ভিএস এক্সিকিউটেবলের নাম 'দেবেনভ' ব্যতীত অন্য কিছুতে পরিবর্তন করার সিদ্ধান্ত নেন তবে এটি ব্যর্থ হবে সে বিষয়ে সচেতন হন। ব্যর্থতার হার খুব কম থাকবে, কেবলমাত্র কোডের মধ্যে যে কোনও ফলস্বরূপ ত্রুটি ঘটেছে যা এর ফলস্বরূপ ব্যর্থ হয় এবং আপনি ঠিক থাকবেন তা নিশ্চিত করে নিন।
আপনি যদি ভিজুয়াল স্টুডিও ডিজাইনারে না চলতে চলতে কিছু লাইন চালাতে চান তবে আপনার ডিজাইনমোড সম্পত্তিটি নীচে প্রয়োগ করা উচিত:
// 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();
}
private void CtrlSearcher_Load(object sender, EventArgs e)
{
if(!this.DesignMode) InitCombos();
}
কাস্টম / ব্যবহারকারীর নিয়ন্ত্রণ ব্যবহার করার সময় ডিফল্টরূপে সক্ষম টাইমারগুলি ক্রাশের কারণ হতে পারে। এগুলি ডিফল্টরূপে অক্ষম করুন এবং কেবল ডিজাইন মোড চেকের পরে সক্ষম করুন
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;
ISite.DesignMode।