Kiedy używać kontrolki szablonowej nad kontrolką UserControl?

Szukałem kilku samouczków na temat tworzenia niestandardowych kontrolek w WinRT i mam pytanie.

Powiedzmy, że chcę stworzyć prostą kontrolkę, która zawiera pewne rzeczy, jak siatka z obrazkiem po lewej stronie i kilkoma blokami tekstowymi po prawej stronie.

To znaczy, coś prostego jak:

<Grid Height="100">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0.3*"/>
        <ColumnDefinition Width="0.7*"/>
    </Grid.ColumnDefinitions>
    <Image Source"/Assets/someRandomImage.png"/>
    <StackPanel Grid.Column="1"
                VerticalAlignment="Center">
        <TextBlock Text="Some text"
                   Margin="10,0,10,0"
                   FontSize="24"
                   FontWeight="SemiLight"
                   TextTrimming="CharacterEllipsis"/>
        <TextBlock Text="Some random description..."
                   Margin="10,5,10,0"
                   FontSize="18"
                   FontWeight="Light"
                   Foreground="Gray"
                   TextWrapping="Wrap"
                   TextTrimming="CharacterEllipsis"/>
    </StackPanel>
</Grid>

Stworzyłbym UserControl z tą zawartością, aby móc go zobaczyć w XAML Designer podczas pracy nad jego interfejsem, i dodałbym wszystkie właściwości i DependencyProperties w kodzie UserControl za.

Potem zobaczyłem, że innym podejściem byłoby użycie kontrolki szablonowej, więc musiałbym stworzyć klasę, która dziedziczy po klasie kontrolnej, a następnie użyć powyższego kodu XAML jako szablonu i zastosować go do niestandardowej kontroli i dodać całą resztę logiki.

Oczywiście, musiałbym również dodać właściwość x: Name do niektórych UIElements wewnątrz kontrolki, aby móc z nimi współpracować, ale masz pomysł.

I zastanawiał się, czy można użyć jednej z tych dwóch metod, czy lepiej jest użyć jednej w szczególności i dlaczego? Ponadto, lubię używać UserControls, ponieważ widzę je w oknie projektanta, a zamiast tego nie byłbym w stanie zrobić tego z szablonem, musiałbym uruchomić aplikację i utworzyć instancję kontrolki, aby zobaczyć, jak faktycznie wygląda.

Dzięki za pomoc, myślę, że nie tylko ja mam takie wątpliwości, więc mam nadzieję, że to pytanie pomoże również innym : D

Sergio

Author: Filip Skakun, 2015-03-29

2 answers

UserControl

  • A UserControl jest o wiele łatwiejsze do stworzenia za pomocą Visual Studio lub Blend, zapewniając przyzwoitą obsługę widoku projektu.
  • zazwyczaj używa się go do tworzenia widoku w aplikacji z wielu kontrolek.'
  • najlepiej sprawdza się w przypadku widoku pełnoekranowego lub pełnoekranowego lub jeśli masz złożone widoki, które chcesz podzielić na mniejsze, ewentualnie wielokrotnego użytku fragmenty kodu.
  • Taki widok jest często wspierany przez odpowiedni model widoku, jeśli wybierzesz aby przyjąć wzór MVVM.

  • Jednym z problemów z UserControl jest to, że chociaż można go ponownie użyć w wielu miejscach w aplikacji - trudno jest wprowadzić niewielkie zmiany w sposobie, w jaki wygląda lub zachowuje się w różnych miejscach w aplikacji, ponieważ nie używa szablonów, a drzewo interfejsu jest ładowane do konstruktora.

  • jest zazwyczaj wielokrotnego użytku tylko w zakresie pojedynczej aplikacji.

Custom control

  • A custom control lub w niektórych przypadkach templated control najlepiej nadaje się do małego fragmentu interfejsu użytkownika, który służy jednemu celowi - wizualizuje pojedynczy, określony rodzaj informacji.
  • kontrolka szablonowa może zmienić swój szablon, aby dostosować wizualizacje do konkretnego przypadku użycia. To pozwala mieć przycisk, który wygląda jak domyślny przycisk w jednej aplikacji, zaokrąglone jeden w innym i jeden składa się wyłącznie z obrazów w jeszcze innym. Sprawia, że jest bardziej wielokrotnego użytku, co ma sens, jeśli tworzysz więcej niż jedną aplikację lub chcesz podzielić się swoim niesamowitym kontroluj świat.
  • dobrze napisana Kontrola niestandardowa jest zwykle wielokrotnego użytku w więcej niż jednej aplikacji, ponieważ nie zależy od logiki biznesowej danej aplikacji.
  • zazwyczaj wywodzi się z istniejącej kontroli platformy, takiej jak Button, ToggleButton, ContentControl, Slider, TextBox lub ListView aby dodać lub nadpisać jego logikę. Są jednak przypadki, gdy sensowne jest zrobienie go od podstaw, podklasując "praktycznie abstrakcyjne" Control, ItemsControl, RangeBase, Shape lub nawet FrameworkElement (dwa ostatnie nie są template).
  • drzewo wizualne kontrolki szablonowej jest ładowane po załadowaniu szablonu, co może wystąpić dopiero po zmianie widoczności kontrolki z Collapsed na Visible, co pozwala odroczyć Ładowanie części interfejsu użytkownika w celu poprawy wydajności.
  • ponieważ szablon kontrolki jest ładowany tylko raz, są one idealne do użycia wewnątrz dowolnej tablicy danych ItemsControl (listy, gridviews, itp.). Jeśli używasz kontrolera UserControl, twoja wydajność może naprawdę ucierpieć ponieważ UserControl XAML jest przetwarzany w kółko.

Panel użytkownika

A custom panel to kolejny rodzaj elementu interfejsu użytkownika, który pozwala dostosować sposób, w jaki układa swoje dzieci.

 24
Author: Filip Skakun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-02 07:28:42

Tworzenie kontrolki użytkownika jest o wiele prostsze niż tworzenie kontrolki niestandardowej. Na początek kontrola użytkownika ma wsparcie projektanta. Wadą kontroli użytkownika jest to, że jest ona ograniczona w porównaniu z kontrolą niestandardową.

Kontrola użytkownika jest doskonała jeśli chcesz stworzyć kontrolkę, która jest kompozycją innych kontrolek, jak w twoim przykładzie, ale załóżmy, że chcesz utworzyć specjalny rodzaj panelu, to naprawdę musisz utworzyć niestandardową kontrolę.

So in summary user sterowanie "prostym" sterowaniem kontrola użytkownika dla złożonych kontroli. Dowolna kontrola użytkownika może być utworzona przez kontrolę niestandardową, ale nie na odwrót.

 3
Author: Philip Stuyck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-29 20:43:45