2016-03-07 142 views
5

在Visual Studio Designer中,在屬性窗口下,您可以使用顏色選擇器選擇ForeColorBackColor等。當你想選擇一種顏色時,一個顏色選擇器會出現選項卡'Custom,Web,System'。 如果選擇自定義,則可以向拾取器添加新顏色,但只有底部的2行可以更改,並且更改不會持續存在於控件中。因此,如果您向調色板添加顏色,當您選擇另一個控件並想要更改例如BackColor時,您以前添加的顏色不存在。Visual Studio顏色屬性編輯器中的自定義調色板

有沒有辦法在設計器的顏色選擇器控件中創建和導入一組自定義的顏色?

注意:這個問題不是關於VS主題,或者如果顏色可以在代碼隱藏中作爲類實現。我想通過一種方法來裁剪設計師。

回答

4

可幫助您在視覺工作室中選擇顏色的編輯器是ColorEditor,它不會在不同控件之間保留自定義顏色。爲了解決這個問題,你應該:

  • 創建基於ColorEditor
  • 定製UITypeEditor註冊在Visual Studio中啓動該編輯器Color

這是包括我使用的代碼的詳細解答解決問題。

創建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屬性窗口。看看那些RedGreenBlue在對話框的底部,我們補充說:

enter image description here

0

我知道它已經很長一段時間......

您可以使用MergedDictionaries和引用資源字典你的App.xml文件。

這將把你在調色板中定義的顏色,但你將不得不包括相同的資源字典,並在每個App.xaml中引用它,對於你使用的每個應用程序,在我看來,這是很好的,因爲有時你有爲不同的應用程序使用自定義顏色。 Custom Color Palette

之類的東西