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


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.


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 .


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.