2011-08-06 21 views
7

PropertyGrid'de dize için Visual Studio benzeri bir düzenleyiciye sahip olmanın en kolay yolu nedir? Örneğin Autos/Locals/Watches'da dize değerlerini in-line olarak önizleyebilir/düzenleyebilirsiniz, ancak ayrıca büyüteç üzerine tıklayıp harici pencerede dize görebilirsiniz.C# özellik ızgara dize düzenleyicisi

+0

kendi UITypeEditor ile * Bu bazı * yapabilirsiniz. –

cevap

8

Bunu aşağıdaki gibi bir UITypeEditor aracılığıyla yapabilirsiniz. Burada bireysel mülkiyet kullanıyorum ama (bütün özelliklerini süslemek gerek kalmaması) IIRC da tüm dizeleri subvert:

using System; 
using System.ComponentModel; 
using System.Drawing.Design; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     using(var frm = new Form { Controls = { new PropertyGrid { 
      Dock = DockStyle.Fill, SelectedObject = new Foo { Bar = "abc"}}}}) 
     { 
      Application.Run(frm); 
     } 
    } 
} 

class Foo 
{ 
    [Editor(typeof(FancyStringEditor), typeof(UITypeEditor))] 
    public string Bar { get; set; } 
} 
class FancyStringEditor : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     var svc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); 
     if (svc != null) 
     { 
      using (var frm = new Form { Text = "Your editor here"}) 
      using (var txt = new TextBox { Text = (string)value, Dock = DockStyle.Fill, Multiline = true }) 
      using (var ok = new Button { Text = "OK", Dock = DockStyle.Bottom }) 
      { 
       frm.Controls.Add(txt); 
       frm.Controls.Add(ok); 
       frm.AcceptButton = ok; 
       ok.DialogResult = DialogResult.OK; 
       if (svc.ShowDialog(frm) == DialogResult.OK) 
       { 
        value = txt.Text; 
       } 
      } 
     } 
     return value; 
    } 
} 

tüm için bu uygulamak için dize üyeler: yerine [Editor(...)] ekleme yere erken uygulamasında aşağıdaki geçerlidir:

TypeDescriptor.AddAttributes(typeof(string), new EditorAttribute(
    typeof(FancyStringEditor), typeof(UITypeEditor))); 
+0

Aslında cevabınızı reddetmeliyim, çünkü tembel bir şekilde gitmemi ve sadece kopyalayıp kodunuzu yapıştırmamı teşvik ediyor. ;) – John

+0

Evet, bu kod mükemmel, basit ve hemen çalışıyor. Teşekkürler – IEnumerable