Jaka jest różnica między biblioteką kontroli użytkownika a biblioteką kontroli niestandardowej?

168

Właśnie zbliżam się do prędkości w WPF i chciałbym utworzyć kontrolkę WPF wielokrotnego użytku.

Kiedy patrzę na opcje tworzenia projektów w programie Visual Studio, widzę „Bibliotekę kontroli użytkownika WPF” i „Bibliotekę niestandardowych formantów WPF”. Nie jest dla mnie jasne, jaka jest różnica między nimi, a moje wyszukiwania w Google nie przyniosły żadnych przyzwoitych wyjaśnień.

Chciałbym zrozumieć różnice między nimi i najlepiej zobaczyć kilka przykładów, kiedy należy ich używać.

17 z 26
źródło
2
Nie zapomnij o zagnieżdżeniu zawartości lub zmianie szablonu kontrolki jako opcji. W ten sposób możesz wprowadzić całkiem dramatyczne zmiany w kontrolce bez konieczności pisania kontrolki niestandardowej.
MichaC
Tylko to, co powiedział MichaC. Najlepszą częścią WPF jest to, że tworzenie szablonów istniejących formantów może mieć ogromny wpływ. Rzadko powinieneś wymagać niestandardowych kontroli. W przeciwieństwie do WinForms, gdzie nawet niewielkie zmiany w kontrolce wymagały nowej pochodnej kontrolki.
Mikko Rantanen
Nadal przydatne. Miej kolejną złotą odznakę.
ouflak

Odpowiedzi:

117

W praktyce kontrolki niestandardowe to coś, co implementujesz na poziomie kodu, podczas gdy możesz używać XAML dla kontrolek użytkownika. Kontrolki niestandardowe rozszerzają jedną z klas bazowych formantów WPF i zapewniają dodatkowe funkcje za pośrednictwem kodu, więc cała dodana logika i reprezentacja muszą zostać zaimplementowane w kodzie.

Kontrolka użytkownika to z technicznego punktu widzenia normalna kontrolka zawartości, którą można rozszerzyć w niektórych częściach kodu, ale zwykle jest ona rozszerzana przez umieszczenie w niej innych kontrolek. Tak więc, jak wspomniał Kent, UserControl jest agregacją innych kontrolek. Ogranicza to znacznie to, co możesz zrobić z kontrolką użytkownika. Jest łatwiejszy w użyciu, ale bardziej ograniczony niż w pełni niestandardowa kontrola.

Te kontrolki mają niewielką różnicę z punktu widzenia środowiska wykonawczego. Podczas budowania aplikacji i umieszczania w niej UserControl, drzewo kontroli będzie zawierało konkretny szablon UserControl. Więc jeśli weźmiemy pod uwagę kiepski przykład wyspecjalizowanego przycisku. Gdybyś używał kontrolki użytkownika, dodałbyś przycisk wewnątrz <UserControl>elementu. Korzystając z niestandardowej kontrolki, najprawdopodobniej wyprowadzisz ją z przycisku. Różnica byłaby widoczna w drzewie logicznym.

Podczas gdy kontrolka niestandardowa zapewniłaby drzewo logiczne podobne do

  • Okno
    • CustomButton

UserControl dałoby logiczne drzewo

  • Okno
    • CustomButtonUserControl
      • Przycisk

Ostatecznie UserControl jest zwykłym ContentControl, który można nieco rozszerzyć i dla którego można wstępnie zdefiniować zawartość. Kontrola niestandardowa zapewnia większą elastyczność za cenę łatwości implementacji, ponieważ musisz wykonać całą logikę i interakcję w kodzie, zamiast korzystać z zalet języka XAML.

Chociaż po tym wszystkim nie sądzę, aby było tak wiele różnic w szablonach Visual Studio. Najprawdopodobniej kontrolka niestandardowa programu Visual Studio po prostu tworzy projekt z pustą kontrolką niestandardową, podczas gdy projekt kontroli użytkownika jest projektem z pustą kontrolką użytkownika. Możesz później dodać do projektu dowolne elementy.

Aktualizacja

A moja opinia na temat tego, kiedy używać kontroli niestandardowej i kontroli użytkownika, jest taka, że ​​jeśli możesz coś zrobić za pomocą kontrolki użytkownika, a dodatkowy element kontrolny w drzewie logicznym Ci nie przeszkadza, użyj kontroli użytkownika, ponieważ są one o wiele łatwiejsze do wykonania tworzyć i utrzymywać. Użyj kontrolki niestandardowej tylko wtedy, gdy masz powód, aby nie używać kontrolki użytkownika.

Mikko Rantanen
źródło
2
Czy formant niestandardowy może służyć do agregowania innych formantów?
17 z 26
A co z problemem, który można zmienić / szablonować?
17 z 26
1
Nie wiem, co masz na myśli, mówiąc o agregowaniu. Nie można utworzyć kontrolki niestandardowej, agregując inne kontrolki. Możesz jednak wyprowadzić z kontrolki panelu, takiej jak StackPanel, Grid lub sam panel, dzięki czemu możesz zaimplementować kontener układu z niestandardową kontrolką (nie jestem pewien, czy możesz to zrobić za pomocą kontrolki użytkownika).
Mikko Rantanen
Tak, ale jeśli chcesz tylko zagregować inne kontrolki, prawdopodobnie znacznie łatwiej będzie to zrobić za pomocą kontroli użytkownika. W zależności od tego, co chcesz zrobić, niestandardowa kontrolka może być naprawdę trudna do napisania, dlatego warto zdecydować się na użycie kontrolki użytkownika, nawet jeśli zapewnia ona tylko podzbiór możliwości.
MichaC
1
Oba te kontrolki powinny być możliwe do zmiany skórki / tworzenia szablonów, jeśli zostaną wdrożone we właściwy sposób. Niestety, moja referencja WPF znajduje się obecnie w biurze, więc nie mogę sprawdzić szczegółów implementacji.
Mikko Rantanen
23

A Controlreprezentuje pewne zachowanie, które można modyfikować (szablon), podczas gdy a UserControljest generalnie agregacją Controls wyższego poziomu , specyficzną dla aplikacji.

Więcej informacji tutaj .

Kent Boogaart
źródło
3
To jeden z linków, które znalazłem, a który nie wyjaśniał zbyt dobrze :). Wydaje mi się, że brakuje mi jednego, co naprawdę oznacza skinnable / templatable i dlaczego nie można tego zrobić za pomocą kontroli użytkownika. Ponadto ostatnie zdanie połączonego posta to „Ogólnie rzecz biorąc, niestandardowe kontrolki mają większą elastyczność i możliwość ponownego wykorzystania niż kontrolki użytkownika”. Jeśli to prawda, dlaczego miałbym kiedykolwiek chcieć utworzyć kontrolkę użytkownika?
17 z 26