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: