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:

12

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.

8 KOMENTARZE

  1. 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

  2. @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.

  3. @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ę).

  4. 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.

  5. 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 : )

  6. @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 ;)

  7. 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.