在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發(fā)教程 > 詳細頁面

為 Microsoft Visual Studio .NET 設計工具創(chuàng)建可設計式元件(轉貼)下

為 Microsoft Visual Studio .NET 設計工具創(chuàng)建可設計式元件(轉貼)下

更新時間:2022-04-27 文章作者:未知 信息來源:網(wǎng)絡 閱讀次數(shù):

以相同方式出入:透過程式碼保存元件
  不同於以往的設計工具,.Net Framework 元件的 Win Forms 與其它 VS .NET 設計工具,僅依賴表單狀態(tài)的程式碼保存性。沒有神奇的格式,也沒有隱藏資料,只是運作平穩(wěn)的普通程式碼。當然,像點陣圖和本土化字串等,可以視為二進元資料與程式碼一起封裝,但元件狀態(tài)和元件所含內(nèi)容,則必須透過程式碼來保存。在您設計工具的同時,也會產(chǎn)生程式碼。倘若您針對該程式碼進行處理,則會重新剖析,並且將變更內(nèi)容反應在設計工具中。

.Net Framework 的設計工具可提供所有配備以利用此功能。所有設計工具對於任何類型最希望得知的內(nèi)容包括:

有哪些關於物件狀態(tài)的資訊有助於保存性?

如何將該類資訊以現(xiàn)行物件傳回?

在先前的章節(jié)中,已經(jīng)簡單討論過這個問題。再次聲明,TypeConverter 是處理的核心。產(chǎn)生程式碼和剖析程式碼設計工具,皆與名為 CreationBundle 的 PersistInfo 特定類型有關。例如:

[TypeConverter(typeof(IntBoolString.IntBoolStringConverter))]
public class IntBoolString {
private int intVal;
private string stringVal;
private bool boolVal;

public IntBoolString(string s, int I, bool b) {
This.intVal = I;
This.stringVal =s ;
This.boolVal = b;
}
public bool Bool{
get {return boolVal;}
set {boolVal = value;}
}

public int Int {
get {return intVal;}
set {intVal = value;}
}

public string String {
get {return stringVal;}
set {stringVal = value;}
}

public override string ToString() {
return intVal + "," + boolVal + "," + stringVal;
}

public class IntBoolStringConverter : TypeConverter {

public override bool CanConvertFrom(
ITypeDescriptorContext context,
Type sourceType) {
return (sourcetType == typeof(string));
}

public virtual object ConvertFrom(
ITypeDescriptorContext context,
object value,
object[] arguments) {

if (value is string) {
string stringValue = (string)value;
int intValue;
bool boolValue;

int commaIndex =
stringValue.IndexOf(',');

if (commaIndex != -1) {
intValue = Int32.
Parse(stringValue.
Substring(0, commaIndex));
commaIndex = stringValue.
IndexOf(',',
commaIndex + 1);
if (commaIndex != -1) {
int nextComma = stringValue.IndexOf(',', commaIndex + 1);
if (nextComma != -1) {
boolValue = Boolean.Parse(stringValue.Substring(commaIndex+1,
nextComma - commaIndex));
stringValue = stringValue.Substring(nextComma+1);
return new IntBoolString(intVal, boolVal, stringValue);
}

}
}
throw new FormatException("Can't convert '" + stringValue + "' to IntBoolString Object");
}
}



public override PersistInfo GetPersistInfo(ITypeDescriptorContext context, object value) {
if (value is IntBoolString) {
IntBoolString ibs = (IntBoolString)value;

return new CreationBundle(typeof(IntBoolString), null,
new CreationArgument[] {
new CreationArgument(ibs.Int, typeof(Int32)),
new CreationArgument(ibs.Bool, typeof(bool)),
new CreationArgument(ibs.String, typeof(string))});
}

return base.GetPersistInfo(context, value);
}
}

public override object CreateInstance(ITypeDescriptorContext
context, IDictionary propertyValues) {
return new IntBoolString((int)propertyValues["Int"],
(bool)propertyValues["Bool"],
(string)propertyValue["String"]);
}

public override bool GetCreateInstanceSupported(ITypeDescriptorContext context) {
return true;
}

}


使用 CreationBundle 物件的好處,在於這些物件若擁有符合傳入 CreationArgument 中各種類型的建構函式,就能夠得知用來儲存資訊的物件建立方式。在呼叫 TypeConverter::CreateInstance,並以此方式嘗試建立和初始設定物件時,TypeConverter 的預設實作會呼叫 CreationBundle::Invoke。倘若無可用的建構函式,則 CreateInstance 呼叫會採用 IDictionary,以允許物件製作更多自訂項目。傳入的 IDictionary 包含每個屬性名稱中不保存的值。

元件的屬性值通常由多個物件所組成,其它架構通常就是為此目的而使用屬性陣列。然而,陣列卻有些缺點,例如,陣列必須在傳出時先行複製,於傳回時再次複製,結果當然大幅影響效能;在新增、修改或刪除值的時候,陣列也無法提供智慧型通知。事實上,如果屬性傳回陣列,是否新增或刪除項目就相當耗費工夫。陣列也是快照值,若基本物件不變更,就無法進行更新。

反之,.Net Framework 在這種情況下,則使用實行 ICollection 物件的集合。物件可建立出集合並傳送給其它物件,同時參照項目可視基本物件的變更而保持最新狀態(tài)。若另一物件也針對集合進行變更,則亦將同時通知該物件。對於使用集合的 .Net Framework 設計工具,還需要支援含有 Get 和 Set 的 All 屬性,且其類型必須為集合可保留的物件陣列。例如:

public class IntCollection : ICollection {
private int[] values;

public IntCollection(int[] intValues) {
this.values = (int[])intValues.Clone();
}

public int[] All {
get {
return (int[])values.Clone();
}
set {
values = (int[])value.Clone();
}
}

public int Count {
get {
if (values == null) {
return 0;
}
return values.Length;
}
}


[Browsable(false)]
public object SyncRoot {
get {
return this;
}
}

[Browsable(false)]
public bool IsReadOnly {
get {
return false;
}
}

[Browsable(false)]
public bool IsSynchronized {
get {
return true;
}
}
}


.Net Framework 的保存性機制,可保存或不保存本集合。若該集合由較先進的類型組成,如上述之 BoolIntString 範例類型,則需要利用與類型相關聯(lián)的 TypeConverter,為集合中每個項目建立有效的 PersistInfo (特別是 VS .NET 設計工具的 CreationBundle)。

元件設計工具
  如之前所述,.Net Framework 中的內(nèi)建設計工具,足以滿足元件的多數(shù)要求。不過,.Net Framework 還包括元件設計工具的完整擴充性架構。所有設計工具皆以 System.ComponentModel.Design.IDesigner 介面為基礎,列示如下:

public interface IDesigner {

// 與本設計工具相關的元件
IComponent Component {get;}

// 與元件相關的設計階段動作,
// 如 TabControl 的「Add Tab」
DesignerVerb[] Verbs {get;}

// 處理設計工具所使用的任何資源。
// 設計工具在本次呼叫後即無法使用。
void Dispose();

// 呼叫以要求設計工具執(zhí)行「預設動作」。
// 通常為了回應執(zhí)行階段在元件上「連按兩下」
// 動作而呼叫。
void DoDefaultAction();

// 以既定元件來初始設定設計工具。
void Initialize(IComponent component);
}


不難看出,IDesigner 是相當直接的。設計工具透過 DesignerAttribute 與元件產(chǎn)生關聯(lián):

[Designer("MyNameSpace.Design.MyComponentDesigner, MyNameSpace.DLL")]
Public class MyComponent : Component {
}


倘若 DesignerAttribute 未出現(xiàn)在類別中,則必須待找出設計工具位置後,才能夠跨越類別階層。在前述範例中,預設的 ComponentDesigner 可能位於元件基礎類別中,同時可供使用。有些設計工具會顯示出 UI,有些則不顯示。在 ComponentDesigner 中,由於元件通常沒有 UI,因此可以看到代表物件的圖示。另一方面,Win 表單控制項則有設計工具可於設計階段顯示出實際控制項。

圖 3:設計階段的 Win 表單控制項

請注意:位於設計工具下的圖示是未顯示 UI 的控制項;而顯示 UI 的 Win 表單控制項,則於執(zhí)行階段顯示在表單設計工具中。然而不論顯示與否,這些控制項全數(shù)皆以 IDesigner 為基礎建立而成。控制項的設計工具通常會攔截設計中的控制項 WindowProc (來自System.WinForms.Design.ControlDesigner 的設計工具可以簡單地覆寫 WndProc 方法來完成),以執(zhí)行諸如點擊測試等複雜的工作。然而,對於大部份元件而言,內(nèi)建的預設設計工具應該已經(jīng)足夠使用。

使用設計工具服務與基礎架構
  在 VS .NET 中的 .Net Framework 設計工具,顯露出多樣化服務和基礎架構元件,可簡化複雜的作業(yè)或允許設計工具了解有關其它部份的狀態(tài)。這些服務永遠使用 GetServiceObject 方法透過 IServiceObjectProvider 進行存取。以下是部分特殊設計工具服務的清單:

類型

 
描述

IDesignerHost
與任何最上層設計工具相關的主要類別。可提供方法以增加服務、建立與放置元件、移除元件並進行批次作業(yè)。

IComponentChangeService
新增、移除、重新命名或修改元件時提供通知。

ISelectionService
設定或取得目前設計工具中選取的項目。

IToolboxService
允許在工具箱內(nèi)查驗和修改項目及選項狀態(tài)等等。

IUndoService
提供配備以建立動作的復原/重做單位,並管理復原/重做堆疊。

IHelpService
允許設定說明主題或者叫用說明項目。

IMenuCommandService
允許處理設計工具功能表指令和動作。

IReferenceService
在設計工具中將參照內(nèi)容對應到物件。例如,名稱 button1 對應到元件 button1 。



IDesignerHost 是 VS .NET 中所有設計工具的基礎。IDesignerHost 亦為 IServiceObjectProvider,可利用動態(tài)方式新增和移除服務。它同時也提供建立元件的方法,以確保是否置於適當?shù)奈恢谩R韵率鞘褂?IDesignerHost 建立元件的範例:

Public class MyDesigner : IDesigner {

// ?.

Private void OnSurfaceDoubleClick(object s, EventArgs e) {
IDesignerHost host =
(IDesignerHost)this.Component.Site.GetServiceObject(typeof(IDesignerHost));
If (host != null) {
Object newComponent = host.CreateComponent(typeof(MyComponent));
DoSomethingInterestingWithComponent(newComponent);
}
}

// ?}


元件授權
  在擴充性的 .Net Framework 模型中,授權架構亦可同時擴充。為了方便使用,架構定義了一項內(nèi)建的標準授權方法,以控制元件是否於設計使用階段獲得授權,不過研發(fā)人員可自由替換本機制。

// 新增 LicenseProviderAttribute 到控制項。
[LicenseProvider(typeof(LicFileLicenseProvider))]
public class MyControl : RichControl {
// 建立新的「空」授權。
private License license = null;
public MyControl () {
// 使控制項的建構函式生效。
license = LicenseManager.Validate(typeof(MyControl), this);
// 是否執(zhí)行其他範例工作? }
public override void Dispose() {
if (license != null) {
license.Dispose();
license = null;
}
}
protected override void Finalize() {
Dispose();
base.Finalize();
}
}


此範例可以使用內(nèi)建授權支援來啟動授權工作。LicFileLicenseProvider 只要在類別的 Assembly 目錄中,尋找名為 <classname>.lic 的檔案,其中 classname 必須是完整的類型名稱。例如,對於 String 類型而言,名稱則為 System.String.lic。本檔案可包含字串「System.String 是已授權的元件」。若發(fā)現(xiàn)本檔案,LicenseManager.Validate 會傳回授權物件,並隨著類別實例來進行處置。

實行您個人的授權機制也一樣輕鬆簡單。只要建立取自 LicenseProvider 的個人類別,並實行個人的 GetLicense 方法即可。您可以登錄為基礎實行授權機制,其中已授權的設計階段元件在登錄檔中有一個項目:

public class RegistryLicenseProvider: LicenseProvider {
public override License GetLicense(
LicenseContext context,
Type type,
object instance,
bool allowExceptions) {

RegistryKey licenseKey = Registry.LocalMachine.
OpenSubKey("Software\\MyCompany\\ComponentLicenses");

if (context.UsageMode == LicenseUsageMode.Designtime) {
if (licenseKey != null && licenseKey.GetValue(type.FullName) != null) {
return new RegLicense(this, type);
}
if (allowExceptions) {
throw new LicenseException(type, instance,
"Couldn''t get design-time license for ''"" +
type.FullName + "''");
}
return null;
}
else {
return new RuntimeRegLicense(this, type);
}
}

private class RuntimeRegLicense : License {
public string LicenseKey {
get {
return type.FullName;
}
}
public override void Dispose() {
}


}

private class RegLicense : License {
private RegistryLicenseProvider owner;
private Type type;

public RegLicense(RegistryLicenseProvider owner, Type type) {
this.owner = owner;
this.type = type;
}

public string LicenseKey {
get {
return type.FullName;
}
}
public override void Dispose() {
}
}

[LicenseProvider(typeof(RegistryLicenseProvider))]
public class MyControl : Control {
}


使用本授權的元件在下列登錄檔中會有一個登錄項目:

HKEY_LOCAL_MACHINE\Software\MyCompany\ComponentLicenses
<Type full name>="true"


結論
  在管理程式碼中撰寫控制項,可為傳統(tǒng)的 C++/COM 方法帶來更多的優(yōu)勢。Microsoft 從最基本的通用語言執(zhí)行階段開始策劃,遍及至 C# 甚至重組的 Visual Basic 語言,以提供研發(fā)人員效率最高的通用方法,將建構軟體時的阻礙降到最低。Microsoft .Net Framework 是第一個以這些技術和原理為基礎,所研發(fā)成功的大型程式碼庫範例,而支援的整合式設計工具,則是本方法成功的關鍵。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 精品一区二区三区毛片| 国产美女视频免费| 国产性生活免费视频| 青青青在线视频免费观看| 亚洲熟妇无码一区二区三区| 国产一区二区片| 自慰无码一区二区三区| 99精品免费在线观看| 国产黄色特级片| 日本女人高潮视频| 另类小说第一页| av动漫免费看| 免费涩涩18网站入口| 国产无限制自拍| 国产中文字幕乱人伦在线观看| 99久热在线精品视频| 欧美 日韩 激情| 91在线视频观看免费| 国产3p露脸普通话对白| 男的插女的下面视频| 在线免费视频a| 分分操这里只有精品| 黄色一级片在线看| 欧美成人一区二区在线观看| 日韩av自拍偷拍| 久操网在线观看| 四虎精品欧美一区二区免费| 久青草视频在线播放| 熟女视频一区二区三区| 天堂视频免费看| 黄色片久久久久| 国产成人一区二区三区别| 嫩草影院中文字幕| 大j8黑人w巨大888a片| 污污网站免费观看| 国产欧美久久久久| 亚洲人精品午夜射精日韩| 最近免费中文字幕中文高清百度| 国产 国语对白 露脸| 精品免费国产一区二区| 国产激情在线观看视频| 日韩视频免费在线播放| 青青青在线视频播放| 亚洲国产精品影视| 97超碰在线人人| 国产av无码专区亚洲精品| 久久久久久久久久久久久国产| av动漫在线观看| ww国产内射精品后入国产| 人人妻人人做人人爽| 国产小视频精品| 午夜探花在线观看| 国产精品av免费| 六月丁香婷婷在线| 999在线免费视频| 成人久久久久久久久| 欧美日韩福利在线| 日本福利视频网站| 欧美视频在线观看视频| 三级黄色片播放| 红桃av在线播放| 成人在线播放网址| 久草视频这里只有精品| 国产一二三四五| 天堂а√在线中文在线| 在线观看的毛片| 成人午夜视频免费观看| 在线视频日韩欧美| 在线观看日本www| 三级网在线观看| 免费看日本毛片| 欧美xxxx吸乳| av久久久久久| 欧美a级黄色大片| 91动漫在线看| 欧美亚洲精品一区二区| 亚洲 欧美 日韩 国产综合 在线 | 欧美国产综合在线| 韩国黄色一级大片| 欧美激情视频免费看| 色爽爽爽爽爽爽爽爽| wwwwwxxxx日本| 亚洲另类第一页| 免费日韩中文字幕| 日韩一区二区三区久久| 日日躁夜夜躁aaaabbbb| 国产精品一区二区小说| 99re6在线观看| 日本道在线视频| 激情 小说 亚洲 图片: 伦| 日韩免费毛片视频| 国产乱女淫av麻豆国产| 东北少妇不带套对白| 一级淫片在线观看| 粉嫩av一区二区三区天美传媒 | 无码人妻少妇伦在线电影| 老司机激情视频| www.日本xxxx| 日韩中文在线字幕| 伊人成人222| 国产精品入口芒果| 日韩久久久久久久久久久久| 可以在线看黄的网站| 蜜臀一区二区三区精品免费视频 | 免费激情视频在线观看| 精品欧美一区免费观看α√| 国产又黄又爽免费视频| 青青青在线视频播放| 欧美黑人又粗又大又爽免费| wwwwww.色| 欧美日韩视频免费在线观看| 波多野结衣家庭教师视频| 97超碰人人看| 二级片在线观看| 日韩不卡一二区| 欧美激情国内自拍| 日本在线xxx| www插插插无码视频网站| 日本成人在线不卡| 中文字幕成人在线视频| 一级黄色录像在线观看| 久久久久久久久久久久久国产| www.色就是色| 99久久99久久精品| 国产精品99久久免费黑人人妻| 国产av人人夜夜澡人人爽麻豆| 亚洲免费在线播放视频| 国产在线视频在线| 国产精品wwwww| 欧美日韩一区二区三区69堂| 婷婷免费在线观看| 日本一二区免费| 亚洲18在线看污www麻豆| 乱熟女高潮一区二区在线| 成人免费aaa| 第四色婷婷基地| 糖心vlog在线免费观看| 日本中文字幕在线不卡| 欧美精品成人网| 亚洲一二三av| 国产xxxx振车| 无码专区aaaaaa免费视频| 成人av在线不卡| 韩国日本美国免费毛片| 日本在线xxx| 波多野结衣激情| 男女h黄动漫啪啪无遮挡软件| 一道本视频在线观看| 欧美国产激情视频| 毛片一区二区三区四区| 久久成年人网站| 人妻互换免费中文字幕| av丝袜天堂网| 伊人久久在线观看| 久久午夜夜伦鲁鲁一区二区| 国产素人在线观看| www.色欧美| 在线视频日韩欧美| 能在线观看的av| 日韩小视频在线播放| 欧美一级特黄aaaaaa在线看片| 茄子视频成人免费观看| 99色这里只有精品| 亚洲综合在线一区二区| 四虎1515hh.com| 欧美国产视频一区| 日韩精品视频网址| 嫩草影院国产精品| 妞干网在线视频观看| 亚洲 欧美 综合 另类 中字| 一道本在线免费视频| 在线看的黄色网址| 国产传媒免费观看| 国产精品视频一二三四区| av免费中文字幕| 国产又爽又黄ai换脸| 午夜免费高清视频| aaa毛片在线观看| 欧美精品99久久| 日日干夜夜操s8| 狠狠操精品视频| 成年网站在线免费观看| 国产精品999.| 国产一二三四在线视频| 你真棒插曲来救救我在线观看| 熟妇人妻无乱码中文字幕真矢织江| 中文国产在线观看| 污版视频在线观看| 日韩免费视频播放| 青青青青草视频| 大桥未久一区二区三区| av磁力番号网| 欧美二区在线视频| 国产欧美在线一区| 亚洲高清av一区二区三区| 日韩网站在线免费观看| 欧美精品色婷婷五月综合| 亚洲最大成人在线观看| 中文字幕一区久久| 在线免费观看av网|