No nie tak całkowicie :) ale warto jednak pamiętać o takim małym wynalazku msowym o nazwie Windows Presentation Foundation w skrócie powszechnie znanym jako WPF. Ale dlaczego?
Podam prosty przykład :) Stwórzcie mi komórkę w gridzie bindowaną do danych wyglądającą tak:
Gdzie:
- Nazwa – pochodzi z danych z bazy;
- Klepsydra – zawiera custom context menu;
- CheckBox – po kliknięciu otwiera okno w którym w zależności od akcji odznaczy się lub nie; dobra tą opcję można pominąć, ważne by się odhaczał a odhaczenie oznacza zmianę danych.
Tutaj mogę wam podpowiedzieć, by to zrobić należy przeciążyć kilka klas lub przynajmniej jedną (w zależności czy aby tylko i wyłącznie chcemy zaktualizować komórkę czy też kolumnę/wiersz: DataGridViewCell, DataGridViewColumn, DataGridViewRow, a i do tego może warto dodać Support edycji w gridzie danego wiersza: IDataGridViewEditingControl.
Jak dalej macie ochotę i uważacie, że tak będzie dobrze to polecam kilka sampli ze stron MSDN.
Ja ogólnie wymiękłem kiedy zacząłem oprogramowywać metodę:
protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) { /* … */ }
Tam pół biedy parametry, ale jej ciało, dla przykładu z sampli msowych:
// Finally paint the NumericUpDown control Rectangle srcRect = new Rectangle(0, 0, valBounds.Width, valBounds.Height); if (srcRect.Width > 0 && srcRect.Height > 0) { paintingNumericUpDown.DrawToBitmap(renderingBitmap, srcRect); graphics.DrawImage(renderingBitmap, new Rectangle(valBounds.Location, valBounds.Size), srcRect, GraphicsUnit.Pixel); }
A jak obliczy się liczbę linii kodu potrzebną by zrobić taką prostą rzecz jak umieszczenie NumericUpDown control w gridzie, to naprawdę popełnienie samobójstwa z wykorzystaniem krakersa wydaje się całkiem rozsądnym wyjściem :) Tak byście nie musieli ściągać to podam wartość wraz z komentarzami, to 1470 linii kodu… (sic!)
To teraz napiszmy to samo w WPFie :)
<GridViewColumn> <GridViewColumnHeader Content="kol1" ToolTip="toolTip1" /> <GridViewColumn.CellTemplate> <DataTemplate> <Grid HorizontalAlignment="Stretch" VerticalAlignment="Bottom"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="25" /> <ColumnDefinition Width="25" /> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Grid.ColumnSpan="2" Text="{Binding Path=Name}" Margin="2" HorizontalContentAlignment="Center" /> <Image Grid.Row="1" Grid.Column="0" Source="../Resources/wait.png" Width="16" Height="16" Margin="2"> <Image.ContextMenu> <ContextMenu> <MenuItem Header="wszystko" /> </ContextMenu> </Image.ContextMenu> </Image> <CheckBox Grid.Row="1" Grid.Column="1" Margin="2" /> </Grid> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn>
Mhhh, mhhh przepraszam, ile to linii? Sam nie wiem czy opłaca się je nawet liczyć… a do tego nie napisałem ani jednej linijki kodu w C# :) Po prostu piękne :)
Oczywiście to tylko przykład i nie mówię, że WinForms idą do lamusa, ale chcę tylko zwrócić waszą uwagę na to, że czasami warto znać inne technologie i w razie co skorzystać z nich a nie strzelać sobie w kolano.
Zgadzam sie z Toba Gutek, ale o jedny trzeba pamietac – WPF duzo bardziej zasobo zerny i nie zawsze mozna go u klienta wykorzystac :/ Niby czasy super kompow, prockow etc, ale nadal sa sytuacje, ze pomimo checi ciezko z tym :P
@Tomasz: Jak zwykle to zależy od projektu – jednak jeśli masz wybór między Windows Forms a WPF to … nie masz wyboru :)
Obsolete – ten atrybut powinien być na wszystkich klasach w Windows Forms.
Niby tak, ale ja uwazam, ze WinFormsy sa fajne i jeszcze dluugo beda z nami :D fakt, ze mozna sie przy nich pociac, ale co tam ;)
@Tomasz: sure :) Tak myslałem dopóki WPFa nie zastosowałem w projekcie – sorry WinForm is dead (przynajmiej dla mnie i dla projektów które robię).
1) Patrzyłem sobie parę razy na przykłady w WPF i na sprzęcie z wbudowaną kartą przycina się. Niestety :(
2) Kontrolki osadzone w gridzie – korzystam z DevExpressa. Parę kliknięć.
3) W aplikacjach, gdzie wprowadza się dużo danych, czuli formy z dużą ilością kontrolek i musi to działać płynnie, WinForms konkurencji nie ma. Jeśli doda się kontrolki firm ‘trzecich’, to można uzyskać miły wygląd.
Hi Artur,
Ad 1
Nie zawsze winny jest WPF, miałem przypadek laptopa (uP 700MHz) z wbudowaną kartą, gdzie WPF sie cieło – pomogło wyłączenie (SIC!) akceleracji w ustawieniach karty. Sterownik grafiki decelerował obsługe DirectX’a :)
Ad 2
Czasami gotowe rozwiązania nie są wstanie zaspokoić wymagań klienta – wówczas pozostaje xaml i pare tagow.
Ad 3
True, zawsze jednak można osadzić kontrolki wpf w formsach i na odwrót :)
Wpf z perspektywy czasu doceniam za dwie rzeczy:
* programowanie deklaratywne
* możliwość kompletnego przebudowania drzewa kontrolki – cytując pewnego obcokrajowca: osadzenie mpeg’a na buttonie przestało być problemem : )
@Tomek B.
Ad 2
**true** :)
@Artur
Mozna popatrzec na rozwoj Wpfa i co wersja jest i wydejniejszy i lepiej renderuje elementy – w tym i tekst. Czasami tez nie mamy dostepu do kontrolek firmy trzeciej – ja na przyklad w aktualnym projekcie nie moge uzyc zadnych kontrolek ktore nie sa open-source.
Jezeli zas chodzi o przycinanie sie – ja mam notebooka z jakas stara intelowaska karta, jeszcze z przed czasow Visty (tak do 6 miesiecy przed jej wydaniem), nie liczac pewnych sampli na roznych frameworkach MVVM nie zauwazylem by aplikacje std. na wpf jakos sie przycinaly.
Oczywiscie nie twierdze ze app w WinForms to jakies maksymalne tragedie, ale osobiscie wole spedzic 2h nad XAMLem niz 3 dni nad WinForms :)
@Miroslaw
:) zgadzam sie, jezeli mam dany wybor to ja juz tez nie bede sie zastanawial :)
@Tomasz
Kiedys ktos opublikowal post o tym, ze od teraz bedzie tworzyl strony internetowe tylko dla najnowszych przegladarek ;) mozna to porownac do najnowszych kompow :) Oczywiscie zdaza sie projekty, ze trzeba bedzie wspierac starsze systemy wtedy pomyslimy ;)
To ja dorzuce jeszcze jedna zaletę WPFa (albo ogólniej XAMLa) – przy zachowaniu ustalonych konwencji da się w łatwy sposób przygotować szablony (np. T4) służące do generowania spójnego UI. Oczywiście dla WinForms też "się da" ale IMHO korzystając z WPFa jest to duuuuużo łatwiejsze i czytelniejsze.
Comments are closed.