Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, andreich78, Вы писали:
А>Идея простая, но как-то это все через форточку с сигнализацией, хочется как-то дверями пользоваться. А то вдруг добрые разработчики поменяют название private свойства к которому я через Reflection лажу, и карачун.
короче, мне пришлось всё это реализовать на стандартном гриде. описанным выше способом. других путей я не нашел. если нужна помощь — помогу советом, если нужны исходники — не смогу помочь.
Re[4]: Нужен совет как быть с PropertyGrid
От:
Аноним
Дата:
25.08.05 14:36
Оценка:
Здравствуйте, andreich78, Вы писали:
Совет то, что нужно.
Например, A>ну, например показать махонькую картинку после названия свойства, отслеживать клики на ней... ой. это можно
Нарисовать-то можно, а как клики отслеживать тоже через вытащенный через Reflection MouseClick? Или есть более легальный способ? Имелось ввиду клики отслеживать тоже через Reflection?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, andreich78, Вы писали:
А>Совет то, что нужно.
А>Например, A>>ну, например показать махонькую картинку после названия свойства, отслеживать клики на ней... ой. это можно А>Нарисовать-то можно, а как клики отслеживать тоже через вытащенный через Reflection MouseClick? Или есть более легальный способ? Имелось ввиду клики отслеживать тоже через Reflection?
это я написал про интерфейс IPropertyValueUIService
вешает децельные картинки в столбце названий и бросает наружу сообщения о двойных щелчках по картинкам.
еще заявлена возможность изменять тултип свойства в гриде, но, похоже не реализован.
интерфейс поддерживается в design-time, нов рантайме потребуется собственная реализация ISite на родительской форме. или через рефлекшн присвоить пару свойств.
кстати способ с отслеживанием кликов через рефлекшн — самый надежный.
Здравствуйте, andreich78, Вы писали:
A>это я написал про интерфейс IPropertyValueUIService A>вешает децельные картинки в столбце названий и бросает наружу сообщения о двойных щелчках по картинкам. A>еще заявлена возможность изменять тултип свойства в гриде, но, похоже не реализован. A>интерфейс поддерживается в design-time, нов рантайме потребуется собственная реализация ISite на родительской форме. или через рефлекшн присвоить пару свойств. A>кстати способ с отслеживанием кликов через рефлекшн — самый надежный.
Это я. Завел себе логин.
А я думал, что про GetPaintValueSupported и PaintValue у UITypeEditor.
Кстати, Dog написал, что UITypeEditor и TypeConverter помогут с вопросом ввода по маске.
Я что-то не вижу каким образом.
Про реализацию ISite, можно подробнее, не укладывается в голове как через реализацию свойств:
Component,
Container,
DesignMode,
Name,
можно потом через GetService запросить IPropertyValueUIService, у кого? В примере, что-то неясно, класс со свойствами описывает еще свойство типа ISite, а в нем у себя запрашивает этот интерфейс:
public override System.ComponentModel.ISite Site
{
get
{
return base.Site;
}
set
{
if( value != null )
{
base.Site = value;
IPropertyValueUIService uiService = (IPropertyValueUIService)this.GetService(typeof(IPropertyValueUIService));
if( uiService != null )
uiService.AddPropertyValueUIHandler( new PropertyValueUIHandler(this.marginPropertyValueUIHandler) );
}
else
{
IPropertyValueUIService uiService = (IPropertyValueUIService)this.GetService(typeof(IPropertyValueUIService));
if( uiService != null )
uiService.RemovePropertyValueUIHandler( new PropertyValueUIHandler(this.marginPropertyValueUIHandler) );
base.Site = value;
}
}
}
Здравствуйте, andreich78, Вы писали:
A>это я написал про интерфейс IPropertyValueUIService A>вешает децельные картинки в столбце названий и бросает наружу сообщения о двойных щелчках по картинкам. A>еще заявлена возможность изменять тултип свойства в гриде, но, похоже не реализован. A>интерфейс поддерживается в design-time, нов рантайме потребуется собственная реализация ISite на родительской форме. или через рефлекшн присвоить пару свойств. A>кстати способ с отслеживанием кликов через рефлекшн — самый надежный.
Или имелось ввиду перекрыть свойство Site у родительской формы?
Тогда, наверное, в моем случае, свойстово типа ISite надо добавить у класса-реализации ICustomTypeDescriptor, так как свойства — динамические.
P>Это я. Завел себе логин. P>А я думал, что про GetPaintValueSupported и PaintValue у UITypeEditor.
они работают со столбцом значений. клики на картинках отдельно не обрабатывают.
P>Кстати, Dog написал, что UITypeEditor и TypeConverter помогут с вопросом ввода по маске. P>Я что-то не вижу каким образом.
P>Про реализацию ISite, можно подробнее, не укладывается в голове как через реализацию свойств: P>Component, P>Container, P>DesignMode, P>Name, P>можно потом через GetService запросить IPropertyValueUIService, у кого? В примере, что-то неясно, класс со свойствами описывает еще свойство типа ISite, а в нем у себя запрашивает этот интерфейс:
правильно что не укладывается, я похоже спутал ISite с другим интерфейсом или методом, потом поищу.
Суть такая — Проперть Site пропертигриду назначает кто-то извне. При назначении этой проперти он запрашивает у этого ISite`а сервиспровайдера. почти как в примере, только сервис — IServiceProvider. Экземпляр он сохраняет и за различными интерфейсами обращается к нему. в том числе и за IPropertyValueUIService.
Таким образом, есть два пути подставить пропертигриду собственною реализацию IPropertyValueUIService:
— присвоить ему нестандартное значение Site. такое, чтобы оно вернуло твой ServiceProvider. тогда пропертигрид возьмет то что нужно самостоятельно.
— достать через Reflection внутреннее поле, в котором живет сервиспровайдер и назначить его, минуя Site.
вот что я имел в виду, когда говорил о реализации ISite на родительской форме.
совершенно конечно не так надобыло сказать, ближе будет "реализация присваивания родительской формой свойства Site пропертигриду".
A>Суть такая — Проперть Site пропертигриду назначает кто-то извне. При назначении этой проперти он запрашивает у этого ISite`а сервиспровайдера. почти как в примере, только сервис — IServiceProvider. Экземпляр он сохраняет и за различными интерфейсами обращается к нему. в том числе и за IPropertyValueUIService. A>Таким образом, есть два пути подставить пропертигриду собственною реализацию IPropertyValueUIService: A>- присвоить ему нестандартное значение Site. такое, чтобы оно вернуло твой ServiceProvider. тогда пропертигрид возьмет то что нужно самостоятельно. A>- достать через Reflection внутреннее поле, в котором живет сервиспровайдер и назначить его, минуя Site.
В design-time все работает отлично, а в runtime, imho оно заработать не сможет, так этот кто-то, кто назначает PropertyGrid.Site и поддерживает IPropertyValueUIService, это DesignHost, а runtime его просто нет, если конечно с нуля не реализовать, или подключить Microsoft.VisualStudio.dll. По моему так.
P>В design-time все работает отлично, а в runtime, imho оно заработать не сможет, так этот кто-то, кто назначает PropertyGrid.Site и поддерживает IPropertyValueUIService, это DesignHost, а runtime его просто нет, если конечно с нуля не реализовать, или подключить Microsoft.VisualStudio.dll. По моему так.
всё правильно, кроме вывода — реализовать designerhost не нужно, пропертигрид вызывает у него всего пару методов. достаточно перекрыть толmко GetService(Type)
A>всё правильно, кроме вывода — реализовать designerhost не нужно, пропертигрид вызывает у него всего пару методов. достаточно перекрыть толmко GetService(Type)
Извиняюсь, конечно, за тупость, но у чего перекрыть GetService(Type), а главное у чего запрашивать IPropertyValueUIService, если его поддерживает только DesignerHost?
Здравствуйте, Proletarius, Вы писали:
P>Здравствуйте, andreich78, Вы писали:
A>>всё правильно, кроме вывода — реализовать designerhost не нужно, пропертигрид вызывает у него всего пару методов. достаточно перекрыть толmко GetService(Type)
P>Извиняюсь, конечно, за тупость, но у чего перекрыть GetService(Type), а главное у чего запрашивать IPropertyValueUIService, если его поддерживает только DesignerHost?
так.
делаешь класс, реализующий IDesignerHost. в этом классе единственным работающим методом делаешь GetService.
вот с таким кодом:
public object GetService(Type service)
{
if (service == typeof(System.Drawing.Design.IPropertyValueUIService))
{
if (propertyValueUIService == null)
{
propertyValueUIService = new DummyPropertyValueUIService(owner);
propertyValueUIService.AddPropertyValueUIHandler(new System.Drawing.Design.PropertyValueUIHandler(PropertyValueUIHandler));
}
return propertyValueUIService;
}
return owner.GetService(service);
}
у меня в роли owner`а сам пропертигрид, так что если из недр придет запрос на что-нить экзотическое — можно спокойно подставить свою реализацию этого нечта.
а вообще-то можно вместо
Здравствуйте, andreich78, Вы писали:
A>так. A>делаешь класс, реализующий IDesignerHost. в этом классе единственным работающим методом делаешь GetService. A>вот с таким кодом:
A>
A> public object GetService(Type service)
A> {
A> if (service == typeof(System.Drawing.Design.IPropertyValueUIService))
A> {
A> if (propertyValueUIService == null)
A> {
A> propertyValueUIService = new DummyPropertyValueUIService(owner);
A> propertyValueUIService.AddPropertyValueUIHandler(new System.Drawing.Design.PropertyValueUIHandler(PropertyValueUIHandler));
A> }
A> return propertyValueUIService;
A> }
A> return owner.GetService(service);
A> }
A>
И этот класс через reflection подсунуть в PropertyGrid.designerHost?
Кстати, здесь еще реализуется IPropertyValueUIService (DummyPropertyValueUIService), где можно почитать, что там нужно писать, примера реализации ковыряясь через reflection не нашел, в том числе и в DesignerHost.
P>И этот класс через reflection подсунуть в PropertyGrid.designerHost?
да, я делал так. P>Кстати, здесь еще реализуется IPropertyValueUIService (DummyPropertyValueUIService), где можно почитать, что там нужно писать, примера реализации ковыряясь через reflection не нашел, в том числе и в DesignerHost.
это просто реализация этого интерфейса, ничего кроме заполнения пары методов и одного события. можешь рефлектором выдрать из стандартной реализации, если не получится самому запрограммировать.
пока, я щас уже спешу.
слушай, а нахрена тебе этот интерфейс сдался? я им в итоге не пользовался ни разу!
мышь и отрисовка своим фонтом через него не идут!
P>>И этот класс через reflection подсунуть в PropertyGrid.designerHost? A>да, я делал так. P>>Кстати, здесь еще реализуется IPropertyValueUIService (DummyPropertyValueUIService), где можно почитать, что там нужно писать, примера реализации ковыряясь через reflection не нашел, в том числе и в DesignerHost. A>это просто реализация этого интерфейса, ничего кроме заполнения пары методов и одного события. можешь рефлектором выдрать из стандартной реализации, если не получится самому запрограммировать.
Нашел реализацию IPropertyValueUIService в Microsoft.VisualStudio.Designer.Service.
A>пока, я щас уже спешу.
A>слушай, а нахрена тебе этот интерфейс сдался? я им в итоге не пользовался ни разу! A>мышь и отрисовка своим фонтом через него не идут!
Просто, это уже почти, то что нужно. Только вместо одного щелчка — двойной, и свой обработчик.
P>>И этот класс через reflection подсунуть в PropertyGrid.designerHost? A>да, я делал так. P>>Кстати, здесь еще реализуется IPropertyValueUIService (DummyPropertyValueUIService), где можно почитать, что там нужно писать, примера реализации ковыряясь через reflection не нашел, в том числе и в DesignerHost. A>это просто реализация этого интерфейса, ничего кроме заполнения пары методов и одного события. можешь рефлектором выдрать из стандартной реализации, если не получится самому запрограммировать.
A>пока, я щас уже спешу.
A>слушай, а нахрена тебе этот интерфейс сдался? я им в итоге не пользовался ни разу! A>мышь и отрисовка своим фонтом через него не идут!
Хорошо, что мир не без добрых людей.
Спасибо, получилось.
Только почему-то два раза рисуется — буду разбираться.
Re: Нужен совет как быть с PropertyGrid
От:
Аноним
Дата:
26.08.05 06:05
Оценка:
>нету, например свойства ReadOnly...
ReadOnly мжно указать в PropertyDescriptor конкретного поля (я так думаю!)