2013-09-23 2 views
1

Я хочу создать панель окна свойств визуальной студии в моем приложении winform. Infact Я хочу иметь сетку, которая может принимать combobox как одну из его ячеек, поэтому пользователь мог бы выбрать один из своих элементов вместо ввода.Имитация свойств Окно визуальной студии в winform

Я знаю, что это возможно в wpf, но я хочу знать, есть ли способ сделать это в winform-приложении?

Edit: Я ищу способ, чтобы показать результат FooForm в this example только перед FooProperty.

Примечание: Я не могу разместить снимок экрана моего настоящего приложения здесь! но у меня есть что-то вроде следующего изображения в моей сетке свойств, и я хочу показать имя выбранного фонового изображения как значение свойства BackgroudImage, которое указано в красном прямоугольнике вместо значения (none).

enter image description here

скажите, пожалуйста, если есть способ сделать это?

+0

, что вы пробовали? Вы когда-нибудь делали поиск goole http://stackoverflow.com/questions/9226896/using-a-propertygrid-in-c-sharp-winforms-to-store-information-in-a-grid? –

+1

Я думаю, что вы хотите, это элемент управления PropertyGrid. Он будет считывать все свойства отображения объекта и разрешать пользователю изменять свойства во время выполнения, как и при работе с «Окно свойств» во время разработки. –

+1

Я понятия не имею, почему этот вопрос был поставлен «на удержание» - вопрос полностью понятен и полностью сложен, ИМО. Это, конечно же, не «вне темы», что было выбранной причиной. –

ответ

2

Сетка может быть предоставлена ​​через PropertyGrid; это использует реализацию System.ComponentModel, которая очень гибкая, но довольно сложная. Однако для предоставления предлагаемых значений - вы используете метод GetStandardValuesTypeConverter. Полный пример:

(редактировать: потребности CanConvertFrom/ConvertFrom работать комбо)

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 

    public class MyType 
    { 
     [TypeConverter(typeof(GiveMeOptionsConverter))] 
     public string SomeProperty {get;set;} 


     private class GiveMeOptionsConverter : TypeConverter 
     { 
      public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
      { 
       return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); 
      } 
      public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
      { 
       if (value is string) return value; 
       return base.ConvertFrom(context, culture, value); 
      } 
      public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
      { 
       return true; 
      } 
      public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) 
      { 
       return false; // true is drop-down; false is combo 
      } 
      public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) 
      { 
       // this gives you the `MyType` instance if you need it 
       var obj = (MyType)context.Instance; 

       return new StandardValuesCollection(
        new[] { "abc", "def", "ghi" }); 
      } 
     } 
    } 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      using (var grid = new PropertyGrid { 
       Dock = DockStyle.Fill, 
       SelectedObject = new MyType() 
      }) 
      using (var form = new Form { Controls = { grid } }) 
      { 
       Application.Run(form); 
      } 

     } 
    } 
} 
+0

Спасибо большое, это хорошо сработало. Но теперь у меня есть другой вопрос; Как я могу добавить что-то вроде свойства «Элементы» элемента управления ComboBox в свой propertygrid? Я имею в виду, что я хочу иметь текстовое поле с кнопкой обзора рядом с ним как свойство свойстваgrid, чтобы форма открывалась при нажатии кнопки. –

+1

@M_Mogharrabi, для которого требуется пользовательская реализация 'UITypeEditor', связанная с помощью' [TypeEditor (...)] ', с' GetEditStyle() 'return' UITypeEditorEditStyle.Modal' –

+0

Еще раз спасибо, я пробовал ваше решение в http://stackoverflow.com/questions/1016239/how-to-create-custom-propertygrid-editor-item-which-opens-a-form. Но проблема в том, что я не хочу иметь expandableObject.Infact Я хочу показать результат FooForm только перед FooProperty не как значение свойства Bar. –

1

Для этого вы можете использовать PropertyGrid и редактор настраиваемого типа.

Здесь у вас есть подробное объяснение того, что вы можете сделать с сеткой свойств, и как сделать собственный редактор типа пользовательского интерфейса.

http://msdn.microsoft.com/en-us/library/aa302326.aspx

+0

Собственно, редактор настраиваемого типа ('UITypeEditor' и т. Д.) Напрямую не поможет с этим ... это делается в' TypeConverter' –

Смежные вопросы