Udostępnij przez


Omówienie dołączonych właściwości

Dołączona właściwość jest koncepcją XAML. Dołączone właściwości umożliwiają ustawianie dodatkowych par właściwości/wartości na obiekcie, ale właściwości nie są częścią oryginalnej definicji obiektu. Dołączone właściwości są zwykle definiowane jako wyspecjalizowana forma właściwości zależności, która nie ma konwencjonalnego opakowania właściwości w modelu obiektowym typu właściciela.

Wymagania wstępne

Zakładamy, że rozumiesz podstawową koncepcję właściwości zależności i zapoznasz się z omówieniem właściwości zależności.

Dołączone właściwości w języku XAML

W języku XAML ustawiasz dołączone właściwości przy użyciu składni AttachedPropertyProvider.PropertyName. Oto przykład, jak ustawić Canvas.Left w języku XAML.

<Canvas>
  <Button Canvas.Left="50">Hello</Button>
</Canvas>

Uwaga / Notatka

Używamy tylko elementu Canvas.Left jako przykładowej dołączonej właściwości bez pełnego wyjaśnienia, dlaczego chcesz go użyć. Jeśli chcesz dowiedzieć się więcej, do czego służy Canvas.Left i jak Canvas obsługuje swoje elementy podrzędne układu, zobacz temat referencyjny Canvas lub Definiowanie układów w języku XAML.

Dlaczego warto używać dołączonych właściwości?

Dołączone właściwości są sposobem na przełamanie konwencji kodowania, które mogą uniemożliwić różnym obiektom w relacji komunikowanie się ze sobą w czasie działania programu. Z pewnością można umieścić właściwości w wspólnej klasie bazowej, aby każdy obiekt mógł po prostu pobrać i ustawić tę właściwość. Jednak ostatecznie sama liczba scenariuszy, w których chciałbyś to zrobić, spowoduje napuchnięcie klas bazowych przez współdzielone właściwości. Może to nawet wprowadzać przypadki, w których spośród setek elementów potomnych jedynie dwa próbują użyć właściwości. To nie jest dobry projekt klasy. Aby rozwiązać ten problem, dołączona koncepcja właściwości umożliwia obiektowi przypisanie wartości dla właściwości, która nie definiuje własnej struktury klas. Klasa definiująca może odczytywać wartość z obiektów podrzędnych w czasie wykonywania po utworzeniu różnych obiektów w drzewie obiektów.

Na przykład elementy podrzędne mogą używać dołączonych właściwości, aby poinformować ich element nadrzędny o tym, jak mają być prezentowane w interfejsie użytkownika. Jest to przypadek z dołączoną właściwością Canvas.Left . Canvas.Left jest tworzona jako dołączona właściwość, ponieważ jest ona ustawiana na elementach, które znajdują się w elemecie Kanwy , a nie na samej kanwie . Dowolny możliwy element podrzędny następnie używa Canvas.Left i Canvas.Top, aby określić jego przesunięcie w kontenerze układu Canvas. Dołączone właściwości umożliwiają tę pracę bez zaśmiecania modelu obiektów elementu podstawowego z dużą liczbą właściwości, które mają zastosowanie tylko do jednego z wielu możliwych kontenerów układu. Zamiast tego wiele kontenerów układu implementuje własny dołączony zestaw właściwości.

Aby zaimplementować dołączoną właściwość, klasa Canvas definiuje statyczne pole DependencyProperty o nazwie Canvas.LeftProperty. Następnie Canvas udostępnia metody SetLeft i GetLeft jako publiczne metody dostępu dla załączonej właściwości, umożliwiając zarówno ustawianie w XAML, jak i dostęp do wartości w czasie wykonywania. W przypadku języka XAML i systemu właściwości zależności ten zestaw interfejsów API spełnia wzorzec, który umożliwia określoną składnię XAML dla dołączonych właściwości i przechowuje wartość w magazynie właściwości zależności.

W jaki sposób typ właścicieli używa dołączonych właściwości

Mimo że dołączone właściwości można ustawić dla dowolnego elementu XAML (lub dowolnego bazowego obiektu DependencyObject), nie oznacza to automatycznie, że ustawienie właściwości generuje namacalny wynik lub że wartość jest kiedykolwiek uzyskiwana. Typ definiujący dołączoną właściwość zwykle jest zgodny z jednym z następujących scenariuszy:

  • Typ definiujący dołączoną właściwość jest elementem nadrzędnym w relacji z innymi obiektami. Obiekty podrzędne ustawią wartości dla dołączonej właściwości. Typ właściciela dołączonej właściwości ma pewne wrodzone zachowanie, które iteruje przez jego elementy podrzędne, uzyskuje wartości i działa na tych wartościach w pewnym momencie okresu istnienia obiektu (akcja układu, SizeChanged itp.)
  • Typ definiujący dołączoną właściwość jest używany jako element podrzędny dla różnych możliwych elementów nadrzędnych i modeli zawartości, ale informacje te niekoniecznie dotyczą układu.
  • Dołączone właściwości zgłaszają informacje do usługi, a nie do innego elementu interfejsu użytkownika.

Aby uzyskać więcej informacji na temat tych scenariuszy i typów własnych, zobacz sekcję "Więcej o Canvas.Left" w sekcji "Niestandardowe dołączone właściwości".

Dołączone właściwości w kodzie

Dołączone właściwości nie mają typowych opakowań właściwości, które umożliwiają łatwy dostęp do wartości i ich zmiany, tak jak inne właściwości zależności. Wynika to z faktu, że dołączona właściwość nie musi być częścią modelu obiektów wyśrodkowanego w kodzie dla wystąpień, w których właściwość jest ustawiona. (Dopuszczalne jest, choć nietypowe, zdefiniowanie właściwości, która jest zarówno dołączoną właściwością, którą inne typy mogą ustawić na siebie, jak i które ma również konwencjonalne użycie właściwości w typie własności).

Istnieją dwa sposoby ustawiania dołączonej właściwości w kodzie: użyj interfejsów API systemu właściwości lub użyj metod dostępu do wzorca XAML. Te techniki są prawie równoważne w zakresie ich wyniku końcowego, więc który z nich należy użyć, jest głównie kwestią stylu kodowania.

Korzystanie z systemu właściwości

Dołączone właściwości środowiska uruchomieniowego systemu Windows są implementowane jako właściwości zależności, dzięki czemu wartości mogą być przechowywane w udostępnionym magazynie właściwości zależności przez system właściwości. W związku z tym dołączone właściwości udostępniają identyfikator właściwości zależności w klasie będącej właścicielem.

Aby ustawić dołączoną właściwość w kodzie, należy wywołać metodę SetValue i przekazać pole DependencyProperty , które służy jako identyfikator tej dołączonej właściwości. (Należy również przekazać wartość do ustawienia).

Aby uzyskać wartość dołączonej właściwości w kodzie, wywołaj metodę GetValue , ponownie przekazując pole DependencyProperty , które służy jako identyfikator.

Używanie wzorca akcesorów XAML

Procesor XAML musi być w stanie ustawić dołączone wartości właściwości, gdy kod XAML jest analizowany w drzewie obiektów. Typ właściciela dołączonej właściwości musi implementować dedykowane metody dostępu o nazwie w postaci GetPropertyName i SetPropertyName. Te dedykowane metody dostępu są także sposobem na pobieranie lub ustawianie dołączonej właściwości w kodzie. Z perspektywy kodu, dołączona właściwość jest podobna do pola pomocniczego, które ma metody dostępu zamiast akcesorów właściwości, a takie pole może istnieć na dowolnym obiekcie, bez konieczności jego specjalnego definiowania.

W następnym przykładzie pokazano, jak ustawić dołączoną właściwość w kodzie za pomocą interfejsu API akcesoriów XAML. W tym przykładzie myCheckBox jest wystąpieniem klasy CheckBox . Ostatni wiersz to kod, który faktycznie ustawia wartość; poprzedzające wiersze ustanawiają instancje i ich relację nadrzędny-podrzędny. Niekomentowany ostatni wiersz stanowi składnię, jeśli używasz systemu właściwości. Skomentowana ostatnia linia to składnia, jeśli używasz wzorca dostępu XAML.

    Canvas myC = new Canvas();
    CheckBox myCheckBox = new CheckBox();
    myCheckBox.Content = "Hello";
    myC.Children.Add(myCheckBox);
    myCheckBox.SetValue(Canvas.TopProperty,75);
    //Canvas.SetTop(myCheckBox, 75);
    Dim myC As Canvas = New Canvas()
    Dim myCheckBox As CheckBox= New CheckBox()
    myCheckBox.Content = "Hello"
    myC.Children.Add(myCheckBox)
    myCheckBox.SetValue(Canvas.TopProperty,75)
    ' Canvas.SetTop(myCheckBox, 75)
Canvas myC;
CheckBox myCheckBox;
myCheckBox.Content(winrt::box_value(L"Hello"));
myC.Children().Append(myCheckBox);
myCheckBox.SetValue(Canvas::TopProperty(), winrt::box_value(75));
// Canvas::SetTop(myCheckBox, 75);
    Canvas^ myC = ref new Canvas();
    CheckBox^ myCheckBox = ref new CheckBox();
    myCheckBox->Content="Hello";
    myC->Children->Append(myCheckBox);
    myCheckBox->SetValue(Canvas::TopProperty,75);
    // Canvas::SetTop(myCheckBox, 75);

Niestandardowe dołączone właściwości

Aby zapoznać się z przykładami kodu dotyczącymi definiowania niestandardowych dołączonych właściwości i więcej informacji na temat scenariuszy używania dołączonej właściwości, zobacz Niestandardowe dołączone właściwości.

Specjalna składnia dołączonych odwołań do właściwości

Kropka w dołączonej nazwie właściwości jest kluczową częścią wzorca identyfikacji. Czasami występują niejednoznaczności, gdy składnia lub sytuacja traktuje kropkę jako o innym znaczeniu. Na przykład kropka jest traktowana jako przechodzenie modelu obiektów dla ścieżki powiązania. W większości przypadków obejmujących taką niejednoznaczność, istnieje specjalna składnia przyłączonej właściwości, która umożliwia analizowanie wewnętrznej kropki jako separatora właściciel.właściwość przyłączonej właściwości.

  • Aby określić dołączoną właściwość w ramach ścieżki docelowej dla animacji, należy ująć dołączoną nazwę właściwości w nawiasy ()— na przykład (Canvas.Left). Aby uzyskać więcej informacji, zobacz Składnia ścieżki właściwości.

Ostrzeżenie

Istniejące ograniczenie implementacji środowiska uruchomieniowego XAML systemu Windows polega na tym, że nie można animować niestandardowej właściwości dołączonej.

  • Aby ustawić dołączoną właściwość jako właściwość docelową dla odwołania do zasobu z pliku zasobu do x:Uid, użyj specjalnej składni, która wprowadza styl związany z kodem, w pełni kwalifikowaną deklarację using: wewnątrz nawiasów kwadratowych ("[]"), aby utworzyć świadomy podział zakresu. Załóżmy na przykład, że istnieje element <TextBlock x:Uid="Title" />. Klucz zasobu w pliku zasobów, który jest przeznaczony dla wartości Canvas.Top tego wystąpienia, to Title.\[using:Microsoft.UI.Xaml.Controls\]Canvas.Top. Aby uzyskać więcej informacji na temat plików zasobów i języka XAML, zobacz Localize strings in your UI (Lokalizowanie ciągów w interfejsie użytkownika).