2016-03-07 53 views
5

Trong Visual Studio Designer, trong cửa sổ thuộc tính, bạn có thể chọn ForeColor, BackColor v.v. bằng bộ chọn màu. Khi bạn muốn chọn một màu, bộ chọn màu sẽ xuất hiện với các tab 'Tùy chỉnh, Web, Hệ thống'. Nếu bạn chọn tùy chỉnh, thì bạn có thể thêm màu mới vào bộ chọn, nhưng chỉ có 2 hàng dưới cùng có thể thay đổi và các thay đổi không tồn tại trên các điều khiển. Vì vậy, nếu bạn thêm màu vào bảng màu, khi bạn chọn một điều khiển khác và muốn thay đổi ví dụ BackColor, màu đã thêm trước đó của bạn không có ở đó.Bảng màu tùy chỉnh trong Trình chỉnh sửa thuộc tính màu sắc của Studio trực quan

Có cách nào để tạo và nhập bộ màu tùy chỉnh vào bộ điều khiển bộ chọn màu của nhà thiết kế không?

Lưu ý: Câu hỏi này không hỏi về chủ đề VS hoặc nếu màu sắc có thể được triển khai dưới dạng lớp trong mã sau. Tôi đang theo đuổi một nhà thiết kế.

Trả lời

4

Trình chỉnh sửa giúp bạn chọn màu trong studio trực quan là ColorEditor không duy trì màu tùy chỉnh trên các điều khiển khác nhau. Để giải quyết vấn đề, bạn nên:

  • Tạo một tùy chỉnh UITypeEditor dựa trên ColorEditor
  • Đăng ký biên tập cho loại Color lúc khởi động visual studio

Đây là một câu trả lời chi tiết bao gồm mã mà tôi sử dụng để giải quyết vấn đề.

Tạo CustomColorEditor

ColorEditor sử dụng một ColorUI lớp riêng để hiển thị một tin ColorPalette kiểm soát. Bảng màu, sử dụng một mảng màu để hiển thị màu tùy chỉnh.

Để tạo CustomColorEditor Tôi bắt nguồn từ ColorEditor và sử dụng phản chiếu, tìm thấy những thành viên đó và điền mảng bằng cách sử dụng một mảng tĩnh của một số màu để hiển thị ở lần tải đầu tiên. Sau đó, sau khi đóng trình soạn thảo, tôi nhận được các màu tùy chỉnh từ trình soạn thảo và đặt chúng trong mảng tĩnh và khởi tạo trình soạn thảo màu bằng cách sử dụng mảng tĩnh này ở lần tải tiếp theo. Bằng cách này, các màu tùy chỉnh được chia sẻ giữa tất cả các phiên bản của CustomColorEditor của tôi.

Hiện CustomColorEditor thay vì mặc định ColorEditor

Để hiển thị một trình soạn thảo kiểu ui cho tất cả các thuộc tính của một loại hình cụ thể, bạn nên thêm một thuộc tính Editor các loại. Nhưng vì Color không phải là loại của tôi, làm cách nào để thêm thuộc tính Editor vào nó?

TypeDescriptor.AddAttributes đã giúp tôi đăng ký trình chỉnh sửa cho loại Color.

Tôi nên chạy mã để đăng ký thuộc tính ở đâu? Chắc chắn tại thời gian chạy studio trực quan!

Để làm như vậy, tôi đã tạo dự án Gói Visual Studio và đặt mã đăng ký theo phương thức Initialize. Tôi cũng đã thêm thuộc tính ProvideAutoLoad vào lớp gói để làm cho nó tự động tải khi tôi mở một giải pháp.

Sau đó, tôi đã cài đặt gói.

Sau đó, tôi đặt dll trong GAC bằng cách sử dụng gacutil.exe /i "path to dll". Thay vì GAC cũng có thể đặt dll trong Visual Studio gần devenv.exe vì thời gian chạy stusio trực quan sẽ sử dụng nó để hiển thị trình chỉnh sửa màu tùy chỉnh của tôi cho tất cả các thuộc tính màu.

Kết luận

Sau khi thực hiện nhiệm vụ trên, tôi đã mở một trường hợp visual studio mới và trong Windows Forms của tôi dự án, tôi thấy biên tập màu sắc tùy chỉnh của tôi hiển thị cho màu sắc. Các màu ban đầu mà tôi đã đặt hiển thị. Ngoài ra, trình chỉnh sửa màu vẫn tiếp tục tùy chỉnh màu sắc ngay cả giữa các hình thức khác nhau!

Tôi đã chia sẻ mã ở đây. Bạn có thể sử dụng ý tưởng và mã để nâng cao trình chỉnh sửa. Bạn có thể cung cấp các màu tùy chỉnh của mình để hiển thị trong trình chỉnh sửa lúc bắt đầu. Bạn thậm chí có thể thêm một tab khác vào trình chỉnh sửa. Đây là mã số của tôi:

Mã cho Biên soạn Màu sắc

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; 
    } 
} 

Mã cho Gói

[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

Đây sẽ là kết quả trong Visual sở hữu Studio cửa sổ. Nhìn vào những Red, Green, Blue ở dưới cùng của hộp thoại mà chúng tôi đã thêm:

enter image description here

0

Tôi biết nó được khá nhiều thời gian ...

Bạn có thể sử dụng MergedDictionaries và tham khảo một từ điển tài nguyên trong tệp App.xml của bạn.

Điều đó sẽ đặt các màu bạn xác định trong bảng nhưng bạn sẽ phải bao gồm cùng một từ điển tài nguyên và tham chiếu nó trong mọi ứng dụng App.xaml cho mọi ứng dụng bạn sử dụng, theo ý kiến ​​của tôi, rất tốt vì đôi khi bạn có để sử dụng các màu tùy chỉnh cho các ứng dụng khác nhau. Custom Color Palette

Điều gì đó tương tự

Các vấn đề liên quan