2016-03-07 30 views
5

Visual Studio Designerのプロパティウィンドウで、カラーピッカーを使用してForeColor,などを選択できます。色を選択したいときは、「Custom、Web、System」というタブが表示されます。 カスタムを選択すると、ピッカーに新しい色を追加できますが、下の2行だけが変更可能で、変更はコントロール間で維持されません。したがって、パレットに色を追加すると、別のコントロールを選択して、たとえばBackColorのように変更したいときは、前回追加した色はありません。Visual StudioのカスタムカラーパレットColor Property Editor

カスタムカラーセットを作成してデザイナのカラーピッカーコントロールにインポートする方法はありますか?

注:このテーマでは、VSテーマについて、またはコードビハインドのクラスとして色を実装できるかどうかについて質問していません。私はデザイナーを仕立てる方法をとっています。

答えて

4

Visual Studioで色を選択するのに役立つエディタは、異なるコントロール間でカスタム色を維持しないColorEditorです。問題を解決するために、あなたがする必要があります

  • はここ

は、私が使用したコードを含む詳細な回答で登録Visual Studioの起動時のタイプColorのエディタをColorEditor

  • に基づいてカスタムUITypeEditorを作成します。この問題を解決するために。

    CustomColorEditor

    ColorEditorはプライベートColorPaletteコントロールを表示するプライベートColorUIクラスを使用していますを作成します。パレットは、カスタム色を表示するために色の配列を使用します。

    ColorEditorから派生したを作成するには、これらのメンバーを見つけて、最初の負荷で表示するいくつかの色の静的配列を使用して配列を埋めました。エディタを閉じた後、私はエディタからカスタムカラーを取得し、静的配列に入れ、次のロード時にこの静的配列を使ってカラーエディタを初期化します。この方法で、私のCustomColorEditorのすべてのインスタンスでカスタムカラーを共有します。

    代わりにデフォルトColorEditor

    の表示CustomColorEditorあなたは型にEditor属性を追加する必要があり、特定のタイプのすべてのプロパティのUI型エディタを表示します。しかし、Colorは私のタイプではないので、どうすればそれにEditor属性を追加できますか?

    TypeDescriptor.AddAttributesColorタイプのエディタを登録する手助けをしました。

    属性を登録するコードはどこで実行する必要がありますか?確かにビジュアルスタジオのランタイムで!

    これを行うには、Visual Studioパッケージプロジェクトを作成し、登録コードをInitializeパッケージのメソッドに入れます。また、パッケージクラスにProvideAutoLoad属性を追加して、ソリューションを開くときに自動的にロードされるようにしました。

    その後、パッケージをインストールしました。

    次に、私はgacutil.exe /i "path to dll"を使ってGACにdllを入れました。 GACの代わりにVisual Studioのdllをdevenv.exeの近くに置くことができます。これは、visual stusioの実行時にすべてのカラープロパティ用のカスタムカラーエディタを表示するためです。

    結論は、上記のタスクを実行した後、私は新しいVisual Studioのインスタンスを開いて、私のWindowsフォームプロジェクトをして、私は私のカスタムカラーエディタは色のために示さご覧ください。私が設定した初期色が表示されます。また、カラーエディタは異なるフォーム間でもカスタムカラーを保持しました!

    ここでコードを共有しました。アイデアとコードを使用してエディタを拡張することができます。最初にエディタに表示するカスタム色を指定することができます。エディタに別のタブを追加することもできます。ここに私のコードです:カラーEditorの

    コード

    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のプロパティでの結果だろう窓。 ...

    enter image description here

  • 0

    私はそれはかなりの時間がかかった知っ

    あなたはMergedDictionariesを使用することができますし、中にリソースディクショナリを参照:私たちは追加ダイアログの下部に、それらのRedGreenBlueを見てApp.xmlファイル

    あなたが定義した色をパレットに入れますが、同じリソースディクショナリを含めて、使用するすべてのアプリケーションのすべてのApp.xamlに参照する必要があります。私の意見では、さまざまなアプリケーションにカスタムカラーを使用できます。 Custom Color Palette

    このようなもの