Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Custom properties u C#-u

[es] :: .NET :: .NET Desktop razvoj :: Custom properties u C#-u

[ Pregleda: 2608 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Bope

Član broj: 62233
Poruke: 291
*.adsl.verat.net.

Sajt: www.shortsms.me


+4 Profil

icon Custom properties u C#-u26.12.2007. u 05:06 - pre 198 meseci
Pozdrav!

Pravim svoj UserControl u C# 2005 i naleteo sam na grdan problem:

Zelim da taj moj UserControl kao pozadinsku boju dobije gradijent koji korisnik (drugi programer) odredi iz properties grid-a.Nema problema - napravio sam custom prozor koji se pojavljuje u properties grid-u i u kome korisnik kontrole odredjuje parametre gradijenta.E sad,nakon setovanja gradijenta sve bude ok ali posle kompajliranja projekta koji koristi moju UserControl gradijent se ponisti,jednostavno nestane! U Form1.designer (Form1 je parent moje kontrole),pod listom propertija moje kontrole nema svojstva za gradijent!!! (prilikom postavljanja kontrole,to svojstvo postoji i setovano je na null,posle kompajliranja svojstvo nestane).

Evo ga kod za setovanje gradijenta moje UserControl,nadam se da ce neko moci da mi kaze u cemu gresim!

Code:

        private class ContrastEditor : UITypeEditor
        {
            public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
            {
                return UITypeEditorEditStyle.DropDown;
            }

            public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
            {
                IWindowsFormsEditorService wfes = provider.GetService(
                    typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;

                if (wfes != null)
                {
                    probapropertis.Form2 _frmContrast = new probapropertis.Form2();

                    _frmContrast._wfes = wfes;
                    wfes.DropDownControl(_frmContrast);
                    value = _frmContrast.DohvatiGrad();
                }
                return value;
            }
        }

        LinearGradientBrush _bckgr;
        [Editor(typeof(ContrastEditor), typeof(UITypeEditor))]
        public LinearGradientBrush BackgroundGrad
        {
            get
            {
                return _bckgr;
            }
            set
            {
                _bckgr = value;
                Invalidate();
            }
        }


Jeste,vidim ja to "LinearGradientBrush _bckgr;" ali bez obzira koju default vrednost da mu dam,uvek se desi isto....
Druga svojstva kontrole (koja su tipa,recimo,Color) rade regularno i ostaju onakva kakva su setovana od strane korisnika bez obzira koja im je default vrednost....Da li je to do tipa sa kojim se radi? Pokusao sam i sa Brus tipom (pa ga posle,castujem u LinearGradientBrush) ali isto...

O cemu se radi?

P.S. Moja kontrola je izvedena iz "Button" klase
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
77.46.155.*



+171 Profil

icon Re: Custom properties u C#-u26.12.2007. u 08:42 - pre 198 meseci
Probaj sledecu stvar

Uzmi i setuje vrednost preko tvog UIEditora, drugim recima uradi sve isto kao sto si opisao da bi setovao svoj LinearGradientBrush. Zatim kad si se uverio da si setovao ispravno, uzmi, recimo, i setuj property Text od forme. Znaci promeni u nesto "Blablabla". Zatim kada si promenio text property forme izadji iz designer-a, mislim zatvori formu i zatim probaj ponovo da udjes i vidi da li je sad zapisan taj tvoj LinearGradientBrush.

 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Custom properties u C#-u26.12.2007. u 09:43 - pre 198 meseci
Probaj sledecu deklaraciju propertija:

Code:

        LinearGradientBrush _bckgr = null;
        [Editor(typeof(ContrastEditor), typeof(UITypeEditor)), 
              DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public LinearGradientBrush BackgroundGrad
        {
            get
            {
                return _bckgr;
            }
            set
            {
                _bckgr = value;
                Invalidate();
            }
        }



Moras da kazes VS dizajeneru da serijalizuje kod koji ce generisati tvoj LineraGradientBrush
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Bope

Član broj: 62233
Poruke: 291
*.adsl.verat.net.

Sajt: www.shortsms.me


+4 Profil

icon Re: Custom properties u C#-u26.12.2007. u 09:49 - pre 198 meseci
Ne pomaze.Sve je ok dok se ne kompajlira.Kada se kompajlira property se vrati u null;
A kada napravim tu kontrolu,u InitializeComponent() roditelja se kao to gradijent svojstvo doda null (kao sto i treba),ali cim ga ja promenim ceo taj red koji odredjuje gradient property se ukloni iz InitializeComponent() kao da ga nije ni bilo.VS to sam uradi.

Mislim da GC ima neke veze sa tim.Sve u svemu od kad sam postavio temu "malo" sam radio na tom problemu i zakljucio da je izgleda problem u tom LinearGradientBrush tipu...Kada umesto njega prosledim nazad niz objekata koji opisuju gradijent (boja,ugao i sl) sve je ok! 8-|

Problem sam resio,ali mi nije jasno zasto ono gore nije htelo pa sad umesto elegantno da prebacim konkretnu stvar ja moram da je razbijam u parametre pa da ih pakujem i sl....

Da li iko od Vas moze da resi misteriju?

P.S. @MMIX sada cu da probam to sto mi rpeporucujes
 
Odgovor na temu

Bope

Član broj: 62233
Poruke: 291
*.adsl.verat.net.

Sajt: www.shortsms.me


+4 Profil

icon Re: Custom properties u C#-u26.12.2007. u 10:05 - pre 198 meseci
@MMAX:
pomak ali tek sad mi nista nije jasno-posle kompajliranja property se zadrzi ali cim pocne kompajliranje iskoci mi nekoliko "Microsoft Visual Studio" poruka u kojima pise:

"Code generation for property InterpolationColors failed. Error was: "Property accessor 'InterpolationColors' on object 'System.Drawing.Drawing2D.LinearGradiendBrush' threw the following exception:'Property must be set to a valid ColorBlend object to use interpolation colors. ColorBlend objects must be constructed with the same number of positions and color values. Positions must be between 0.0 and 1.0,1.0 indicating the last element in teh array"

Nije mi jasno...Ja sam napravio obican gradijent,nisam koristio blend...
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
77.46.155.*



+171 Profil

icon Re: Custom properties u C#-u26.12.2007. u 11:51 - pre 198 meseci
OK. Da pojasnim malo. Tvoj kod sto si napisao za UIEditor nije zavrsen, odnosno fali mu jos koja linija koda ali to je samo jedan deo price. Naime, VS koristi CodeDomSerializer klasu da bi zapisao objekte u taj cuveni InitializeComponent. Nacin na koji on to radi je taj sto pocne od root kontrole i krene redom da cita property-je koje ce da serializuje i zatim zapisuje u InitializeComponent, da bi ti uradio to isto moras da namestis svoj CodeDomSerializer kako bi zapisao. Naravno, ovo vazi samo za klase koje CodeDomSerialize ne moze da serializuje. Mene iskreno cudi sto LinearGradientBrush ne moze da se serializuje, no dobro, moze ovako i preko UITypeEditor ali, kao sto rekoh, to je samo jedan deo price. UITypeEditor ti popunjava objekat u desing time-u a CodeDomSerializer ti je zapisuje u InitializeComponent. Znaci pogledaj CodeDomSerializer klasu i mislim da ce ti biti jasno.
 
Odgovor na temu

Bope

Član broj: 62233
Poruke: 291
*.adsl.verat.net.

Sajt: www.shortsms.me


+4 Profil

icon Re: Custom properties u C#-u26.12.2007. u 12:42 - pre 198 meseci
da da da mislim da kapiram.a ta "UIType" klasa je kod mene ubacena u klasu usercontrole.ok,pogledacu CodeDomSerializer to obecava.

Hvala! :)
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Custom properties u C#-u26.12.2007. u 14:01 - pre 198 meseci
Nazalost, ne verujem da je custom CodeDomSerializer resenje, kao prvo ne mozes da ga nakacis na fabricke klase, mozes samo na svoju klasu. A da pises code serializer za celu kontrolu samo da bi zadovoljio jedan property je malo overkill.

A sad da te obradujem malo sam se igrao sa debagerom i neces moci da uradis nista od ovoga lagano, a glavni razlog je implementacija 'InterpolationColors' propertija u LinearGradientBrush-u. Ako brush ne koristi blend property baca exception pri citanju sto je po meni totalno idiotski sa njihove strane, mogli su lepo da vrate null, bacanje exceptiona u get accessoru je glupo. Kad designer klasa pokusava da iskoristi codedomserializer da snimi kod za sve public propertije brush-a pukne pri citanju 'InterpolationColors' (da bi zapisao vrednot u sors, prvo mora da je procita iz instance u dizajneru) i baci ti gresku. Znaci greska se ne javlja kod kompajliranja nego kod snimanja forme (s tim sto kompajliranje snimi fajl pre builda pa ti se cini da je kompajler greska).

Resenje? Jedino sto meni pada na pamet je da napravis svoj CustomLinearGradientBrush koji nasledis od LinearGradientBrush i stavis samo jedan property, 'InterpolationColors' a deklarises ga sa new i pojedes exception pri citanju Onda iskoristi taj svoj novi brush umesto fabrickog u svom programu. Medjutim, ne lezi vraze, fabricki LinearGradientBrush je sealed i ne moze se nasledjivati.

Realno, vrati se na pocetak i napravi svoju klasu koja ce drzati samo public get/set propertije koji ti trebaju da inicijalizujes brush i metod koji ti vraca brush od tih parametara, onda tu klasu edituj kroz svoj UITypeEditor, a u buttonu koristi taj metod da uzmes brush kad ti treba. Programerski receno, enkapsuliraj brush u svojoj klasi na ciju serijalizaciju mozes da utices.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
77.46.155.*



+171 Profil

icon Re: Custom properties u C#-u26.12.2007. u 17:10 - pre 198 meseci
Evo jedan mali primer sto sam namestio. Koristi CodeDomSerializer za wraper koji sadrzi LinearGradentBrush. Na zalost, wraper mora da ide oko LinearGradentBrush-a jer CodeDomSerializer atribut moze da se lepi samo na klase i interfejse. Moram priznati namuci me ova slagalica od CodeExpression-a.

Inace, poslusao bi savet mmix i sklapao brush preko nekoliko public property-a jer ovo sa CodeDomSerializer-om je dosta zamorno za pisati.
Prikačeni fajlovi
 
Odgovor na temu

Bope

Član broj: 62233
Poruke: 291
*.adsl.verat.net.

Sajt: www.shortsms.me


+4 Profil

icon Re: Custom properties u C#-u26.12.2007. u 19:00 - pre 198 meseci
Ja po prirodi jesam komplikator ali ono je suvise :)
Sredio sam tako da se umesto gradijenta vraca niz objekata koji opisuju gradijent (boje,ugao,centar i sl)
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Custom properties u C#-u

[ Pregleda: 2608 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.