可幫助您在視覺工作室中選擇顏色的編輯器是ColorEditor
,它不會在不同控件之間保留自定義顏色。爲了解決這個問題,你應該:
這是包括我使用的代碼的詳細解答解決問題。
創建CustomColorEditor
ColorEditor
使用私有ColorUI
類來說明私人ColorPalette
控制。調色板使用一系列顏色來顯示自定義顏色。
要創建CustomColorEditor
我從ColorEditor
派生並使用反射,找到這些成員並使用某些顏色的靜態數組填充陣列以顯示首次加載。然後關閉編輯器後,我從編輯器中獲取自定義顏色,並將它們放入靜態數組中,並在下次加載時使用此靜態數組初始化顏色編輯器。這種方式自定義顏色在我的CustomColorEditor
的所有實例之間共享。
顯示CustomColorEditor而不是默認ColorEditor
要顯示特定類型的所有屬性的UI類型編輯器,你應該添加一個Editor
屬性的類型。但由於Color
不是我的類型,我怎麼能加Editor
屬性呢?
TypeDescriptor.AddAttributes
幫我註冊編輯Color
類型。
我應該在哪裏運行代碼來註冊屬性?當然在視覺工作室運行時!
爲此,我創建了一個Visual Studio Package項目,並將註冊碼設置爲Initialize
包裝方法。我還將ProvideAutoLoad
屬性添加到包類中,以便在打開解決方案時自動加載。
然後我安裝了軟件包。
然後我把dll放在GAC中使用gacutil.exe /i "path to dll"
。而不是GAC也可以將DLL放在devenv.exe
附近的Visual Studio中,因爲視覺stusio運行時將使用它來顯示我所有顏色屬性的自定義顏色編輯器。
結論
執行上述任務後,我打開一個新的Visual Studio實例,並在我的Windows窗體項目,我看所示的顏色我的自定義顏色編輯器。我設置的初始顏色顯示。此外,顏色編輯器甚至可以在不同的表單之間保留自定義顏色
我在這裏分享了此代碼。你可以使用這個想法和代碼來增強編輯器。您可以提供自定義顏色,以便在編輯器中顯示。你甚至可以添加另一個選項卡到編輯器。這裏是我的代碼:
代碼顏色編輯
class CustomColorEditor : ColorEditor
{
private static Color[] Colors;
static CustomColorEditor()
{
Colors = new Color[]{
Color.Red, Color.Green, Color.Blue, Color.White,
Color.White, Color.White, Color.White, Color.White,
Color.White, Color.White, Color.White, Color.White,
Color.White, Color.White, Color.White, Color.White,
};
}
public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
var colorEditorObject = this;
Type colorUiType = typeof(ColorEditor).GetNestedType("ColorUI", BindingFlags.NonPublic);
var colorUiConstructor = colorUiType.GetConstructors()[0];
var colorUiField = typeof(ColorEditor).GetField("colorUI", BindingFlags.Instance | BindingFlags.NonPublic);
var colorUiObject = colorUiConstructor.Invoke(new[] { colorEditorObject });
colorUiField.SetValue(colorEditorObject, colorUiObject);
var palField = colorUiObject.GetType().GetField("pal", BindingFlags.Instance | BindingFlags.NonPublic);
var palObject = palField.GetValue(colorUiObject);
var palCustomColorsField = palObject.GetType().GetField("customColors", BindingFlags.Instance | BindingFlags.NonPublic);
palCustomColorsField.SetValue(palObject, Colors);
var selectedValue = base.EditValue(context, provider, value);
Colors = palCustomColorsField.GetValue(palObject) as Color[];
return selectedValue;
}
}
代碼包
[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
[Guid(GuidList.guidVSPackage1PkgString)]
[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids80.SolutionExists)]
public sealed class VSPackage1Package : Package
{
public VSPackage1Package() { }
protected override void Initialize()
{
base.Initialize();
TypeDescriptor.AddAttributes(typeof(Color), new EditorAttribute(typeof(CustomColorEditor), typeof(UITypeEditor)));
}
}
Resut
這將是結果在Visual Studio屬性窗口。看看那些Red
,Green
,Blue
在對話框的底部,我們補充說: