O Mnie

Aktualnie czytam

Komentarze

Polecam

DajSiePoznac
.NET Blogs PL
CodeGuru

Zapomnijcie o Windows Forms

March 8, 2010 in categories: pro by Gutek

9

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.


Podziel się:

 

 

 

8 comments for "Zapomnijcie o Windows Forms"

  1. Tomasz Wisniewski
    Tomasz Wisniewski Says:

    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 Tong

    Reply

  2. Mirosław Pragłowski
    Mirosław Pragłowski Says:

    @Tomasz: Jak zwykle to zależy od projektu - jednak jeśli masz wybór między Windows Forms a WPF to ... nie masz wyboru Smile
    Obsolete - ten atrybut powinien być na wszystkich klasach w Windows Forms.

    Reply

  3. Tomasz Wisniewski
    Tomasz Wisniewski Says:

    Niby tak, ale ja uwazam, ze WinFormsy sa fajne i jeszcze dluugo beda z nami Laughing fakt, ze mozna sie przy nich pociac, ale co tam ;)

    Reply

  4. Mirosław Pragłowski
    Mirosław Pragłowski Says:

    @Tomasz: sure Smile 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ę).

    Reply

  5. Artur
    Artur Says:

    1) Patrzyłem sobie parę razy na przykłady w WPF i na sprzęcie z wbudowaną kartą przycina się. Niestety Frown
    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.

    Reply

    • Tomek B.
      Tomek B. Says:

      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 Smile

      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 Smile


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

      Reply

  6. Gutek
    Gutek Says:

    @Tomek B.

    Ad 2
    true Smile

    @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 Smile

    @Miroslaw

    Smile zgadzam sie, jezeli mam dany wybor to ja juz tez nie bede sie zastanawial Smile

    @Tomasz

    Kiedys ktos opublikowal post o tym, ze od teraz bedzie tworzyl strony internetowe tylko dla najnowszych przegladarek ;) mozna to porownac do najnowszych kompow Smile Oczywiscie zdaza sie projekty, ze trzeba bedzie wspierac starsze systemy wtedy pomyslimy ;)

    Reply

  7. Mirosław Pragłowski
    Mirosław Pragłowski Says:

    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.

    Reply

1 trackbacks or pingbacks for "Zapomnijcie o Windows Forms"

Leave a Comment


(Will show your Gravatar icon)


biuquote




© 2008-2010 Jakub Gutkowski. Powered by BlogEngine.NET 1.5.1.14. Hosted on OrcsWeb.

Design