Jak powinno się korzystać z wpf?

Jak powinno się korzystać z wpf?
D5
  • Rejestracja:ponad 6 lat
  • Ostatnio:6 miesięcy
  • Postów:89
0

Witam mam pytanie ponieważ trochę już programuje sobie w wpf ale mam pewne pytanko odnośnie jak to powinno w nim być ponieważ widziałem ze w wpf dużo używa się mvvm nie wiem jak to do końca działa ale słyszałem ze żeby w pełni wykorzystać możliwości wpf to trzeba to umieć i własnie mam co do tego pytanie jak to z tym jest czy mvvm jest tak bardzo konieczny żeby używać wpf? I przy okazji będąc przy tym mam pytanie ponieważ ja nazywam czasem kontrolki bo ułatwia mi to programowanie w tym ale czy tak powinno się robić żeby się je nazywało czy może jakoś przez jakieś funkcje get set powinno się to robić ?

edytowany 1x, ostatnio: aurel
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Pisanie w WPF bez MVVM to masochizm. Poczytaj o Prism.

GironX
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:59
0
grzesiek51114 napisał(a):

Pisanie w WPF bez MVVM to masochizm. Poczytaj o Prism.

Mam wrażenie, że bez znajomości podstaw WPF, pisanie w MVVM też będzie porażką. ;)

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0
GironX napisał(a):
grzesiek51114 napisał(a):

Pisanie w WPF bez MVVM to masochizm. Poczytaj o Prism.

Mam wrażenie, że bez znajomości podstaw WPF, pisanie w MVVM też będzie porażką. ;)

Bzdura, nawet program konsolowy może być napisany w MVVM. WPF to tylko technologia. ;)

GironX
Z pewnego punktu widzenia wszystko jest technologią. ;)
3

MVVM to paradygmat jak każdy inny, można go używać lub nie.
WPF nie wymaga do szczęścia MVVM, ale MVVM ma swoje zalety i dlatego się go używa.
Spróbuj poczytać o bibliotece MVVM Light, to dobre wprowadzenie do tej technologii.

GironX
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:59
0

Sparzyłem się MVVM przy pierwszym kontakcie, dlatego w moim przypadku, stwierdziłem, że lepiej będzie jeśli złapię podstawy WPF i dopiero wtedy zajmę się MVVM.

aurel
ponieważ trochę już programuje sobie w wpf Wydaje się, że OP podstawy WPFa już zna ;)
JU
  • Rejestracja:około 22 lata
  • Ostatnio:około miesiąc
  • Postów:5042
1

Nie odsyłajcie go do Prism, jak nie zna podstaw.

Prosty przykład (nie 100%), jak to powinno mniej więcej wyglądać.
Dajmy na to, że robisz odtwarzacz mp3.

Najpierw musisz zbudować swój model (M). Model to nic innego jak klasy opisujące Twój problem - czyli tu np. modelem będzie plik mp3. W innej aplikacji do modelu mogłaby należeć Osoba, Adres, Klient itp.

A więc model. Przykładowo może to wyglądać tak:

Kopiuj
public class Mp3File
{
  public string FileName { get; set;}
  public string Title { get; set; }
  public string Author { get; set; }
}

Klasy modelowe często umieszcza się w osobnym projekcie.

Następnie masz coś takiego jak ViewModel (VM). I tu się dzieje tak naprawdę cała magia związana z widokiem. ViewModel to połączenie między widokiem, a resztą aplikacji - innymi serwisami itd.

Na początek może to wyglądać tak:

Kopiuj
public class Mp3ViewModel
{
  public ObservableCollection<Mp3File> Mp3Files { get; set; } = new ObservableCollection<Mp3File>();
}

To tak naprawdę bardzo ułomny ViewModel, ale taki zostawiam dla przejrzystości.

Następnie masz klasę widoku (V) - czyli XAML razem z code behind, np:

Kopiuj
public class Mp3View: Window
{
   Mp3ViewModel vm;
  
   public Mp3View(Mp3ViewModel vm)
   {
      this.vm = vm;
      DataSource = vm;
   }
}

To oczywiście bardzo uproszczone, bo Mp3ViewModel tak naprawdę powinien implementować interfejs w stylu IMp3ViewModel i powinien być wstrzykiwany do Mp3View za pomocą dependency injection.
W każdym razie najważniejsze jest to, że ViewModel NIE WIE NIC o widoku, ale wie o modelu. Model NIE WIE NIC o ViewModel ani o widoku (jest totalnym ignorantem). Natomiast widok wie TYLKO o ViewModel, ale nic nie wie o modelu... No, to nie do końca prawda, że widok nie wie nic o modelu, bo musi znać chociaż nazwy pól, żeby sobie bindować :) Ale nie ma żadnych referencji do modelu.

Teraz, cokolwiek robisz na widoku (np. odtworzenie mp3), powinieneś to robić przez komendy (czytaj: wpf + commands).

Komenda jest tworzona w ViewModel. To jest coś jak zdarzenie w WinForms, ale nie do końca. Po prostu po wciśnięciu przycisku PLAY wywołujesz komendę: "PlayDaMadafakinSong" zamiast obsługiwać zdarzenie ButtonClick :)

Komenda dalej w sobie tylko znany sposób odtwarza plik mp3.

Zatem masz tutaj wszystkie elementy wzorca: Model (M), Widok (V), Widok modelu (VM).

Przy czym przypominam, że model powinien być w osobnym projekcie, natomiast view i viewmodel mogą być w tym samym (ale nie muszą). Zależy tak naprawdę od technologii i aplikacji - jak będzie łatwiej/lepiej.

Do poczytania:
wpf + databinding
wpf + command
wpf + IObservable
wpf + ObservableCollection

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Nie musi się uczyć całego Prisma. Starczą:

  • DelegateCommand oraz DelegateCommand<T>;
  • EventAggragator;
  • BindableBase.

Bez tego będzie musiał napisać mnóstwo, często dziwnego kodu samodzielnie.
To trochę tak jak w ASP.NET MVC. Masz klasę Controller i początkujący w zasadzie nie musi zastanawiać się jak została zaimplementowana. Stosuje dziedziczenie po niej i kontroler działa. Bez frameworku MVVM klasę implementującą INotifyPropertyChanged będzie trzeba napisać samodzielnie, a po co się męczyć skoro mamy BindableBase? To samo dotyczy komend; skoro masz DelegateCommand to po co zawracać sobie głowę samodzielnym tworzeniem implementacji ICommand, rzecz jasna dużo gorszej?

Wiesz... nie mówię, że to jest złoty środek nauki WPF z MVVM, bo sam uczyłem się bez frameworków. Tylko, że później zdałem sobie sprawę z tego, że wiele razy straciłem mnóstwo czasu implementując oczywistości. ;)

PS: Model to nie tylko klasy opisujące różne rzeczy ale także logika biznesowa, serwisy etc...
PS2: Czy Ty właśnie nie zastosowałeś tutaj podejścia Encja na twarz i pchasz? ;)

edytowany 3x, ostatnio: grzesiek51114
GironX
@grzesiek51114 Możesz mi polecić jakieś dobre źródło informacji o MVVM?
GironX
@grzesiek51114 Super, dziękuję.
JU
  • Rejestracja:około 22 lata
  • Ostatnio:około miesiąc
  • Postów:5042
1

Moim zdaniem to jest tak, że wypada poznać/zrozumieć jak się robi rzeczy bez żadnych "wrapperów", czy frameworków. Bo brak takiej wiedzy wychodzi prędzej, czy później. Zresztą wszyscy piszą, że prism do małych aplikacji się nie nadaje, więc dobrym podejściem jest zrobić coś małego bez tego, żeby zrozumieć jak to powinno działać. Później, gdy się użyje np. Prism dużo rzeczy jest jasnych i oczywistych.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)