Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano system właściwości zależności dostępny podczas pisania aplikacji środowiska uruchomieniowego systemu Windows z definicjami XAML dla interfejsu użytkownika.
Co to jest właściwość zależności?
Właściwość zależności jest wyspecjalizowanym typem właściwości. W szczególności jest to właściwość, w której wartość właściwości jest śledzona i wpływana przez dedykowany system właściwości, który jest częścią środowiska uruchomieniowego systemu Windows.
Aby można było obsługiwać właściwość zależności, obiekt definiujący właściwość musi być obiektem DependencyObject (innymi słowy klasą bazową DependencyObject w jej dziedziczeniu). Wiele typów używanych dla definicji interfejsu użytkownika dla aplikacji platformy UWP z językiem XAML będzie podklasą DependencyObject i będzie obsługiwać właściwości zależności. Jednak każdy typ pochodzący z przestrzeni nazw środowiska uruchomieniowego systemu Windows, która nie ma "XAML" w nazwie, nie będzie obsługiwać właściwości zależności; właściwości takich typów to zwykłe właściwości, które nie będą miały zachowania zależności systemu właściwości.
Celem właściwości zależności jest zapewnienie systemowego sposobu obliczania wartości właściwości na podstawie innych danych wejściowych (innych właściwości, zdarzeń i stanów, które występują w aplikacji podczas jej uruchamiania). Te inne dane wejściowe mogą obejmować:
- Dane wejściowe zewnętrzne, takie jak preferencje użytkownika
- Mechanizmy określania właściwości w samą porę, takie jak powiązanie danych, animacje i scenariusze wizualne
- Wzorce tworzenia szablonów wielokrotnego użytku, takie jak zasoby i style
- Wartości znane za pośrednictwem relacji nadrzędny-podrzędny z innymi elementami w drzewie obiektów
Właściwość zależności reprezentuje lub obsługuje określoną funkcję modelu programowania do definiowania aplikacji środowiska uruchomieniowego systemu Windows za pomocą języka XAML dla interfejsu użytkownika. Do tych funkcji należą:
- Powiązanie danych
- Style
- Animacje scenorysowe
- Zachowanie "PropertyChanged"; właściwość zależności można zaimplementować w celu zapewnienia wywołań zwrotnych, które mogą propagować zmiany do innych właściwości zależności
- Używanie wartości domyślnej pochodzącej z metadanych właściwości
- Ogólne narzędzie systemu właściwości, takie jak ClearValue i wyszukiwanie metadanych
Właściwości zależności i właściwości środowiska uruchomieniowego systemu Windows
Właściwości zależności rozszerzają podstawową funkcjonalność właściwości środowiska uruchomieniowego systemu Windows, udostępniając globalny, wewnętrzny magazyn właściwości, który wspiera wszystkie właściwości zależności w aplikacji w czasie wykonywania. Jest to alternatywa dla standardowego wzorca tworzenia kopii zapasowej właściwości z polem prywatnym, które jest prywatne w klasie definicji właściwości. Ten wewnętrzny magazyn właściwości można traktować jako zestaw identyfikatorów właściwości i wartości, które istnieją dla dowolnego określonego obiektu (o ile jest to obiekt DependencyObject). Zamiast być identyfikowanym po nazwie, każdy atrybut w magazynie jest identyfikowany przez wystąpienie DependencyProperty. Jednak system właściwości w większości ukrywa ten szczegół implementacji: zazwyczaj można uzyskać dostęp do właściwości zależności przy użyciu prostej nazwy (nazwa właściwości programowej w używanym języku kodu lub nazwa atrybutu podczas pisania kodu XAML).
Typ podstawowy, który udostępnia podstawy systemu właściwości zależności, to DependencyObject. DependencyObject definiuje metody, które mogą uzyskiwać dostęp do właściwości zależności, a wystąpienia klasy pochodnej DependencyObject wewnętrznie obsługują koncepcję magazynu właściwości, o której wspomnieliśmy wcześniej.
Poniżej przedstawiono podsumowanie terminologii używanej w dokumentacji podczas omawiania właściwości zależności:
| Termin | Description |
|---|---|
| Właściwość zależna | Właściwość, która istnieje w identyfikatorze DependencyProperty (patrz poniżej). Zazwyczaj ten identyfikator jest dostępny jako statyczny członek pochodnej klasy definiującej DependencyObject. |
| Identyfikator właściwości zależności | Stała wartość identyfikująca właściwość, zazwyczaj jest publiczna i tylko do odczytu. |
| Opakowanie właściwości | Wywoływane implementacje get i set dla właściwości Środowiska uruchomieniowego systemu Windows. Albo projekcja definicji oryginalnej specyficzna dla języka. Implementacja otoki właściwości get wywołuje metodę GetValue, przekazując odpowiedni identyfikator właściwości zależności. |
Opakowanie właściwości nie jest tylko udogodnieniem dla wywołujących, ale także uwidacznia właściwość zależności dla dowolnego procesu, narzędzia lub projekcji, które używają definicji Windows Runtime dla właściwości.
W poniższym przykładzie zdefiniowano niestandardową właściwość zależności zdefiniowaną dla języka C#i pokazano relację identyfikatora właściwości zależności z otoką właściwości.
public static readonly DependencyProperty LabelProperty = DependencyProperty.Register(
"Label",
typeof(string),
typeof(ImageWithLabelControl),
new PropertyMetadata(null)
);
public string Label
{
get { return (string)GetValue(LabelProperty); }
set { SetValue(LabelProperty, value); }
}
Uwaga / Notatka
Powyższy przykład nie jest przeznaczony jako kompletny przykład tworzenia niestandardowej właściwości zależności. Ma ona na celu przedstawienie pojęć dotyczących właściwości zależności dla każdego, kto preferuje naukę pojęć za pomocą kodu. Aby uzyskać bardziej kompletne wyjaśnienie tego przykładu, zobacz Niestandardowe właściwości zależności.
Pierwszeństwo wartości właściwości zależnych
Po uzyskaniu wartości właściwości zależności uzyskujesz wartość, która została określona dla tej właściwości za pomocą dowolnego z danych wejściowych, które uczestniczą w systemie właściwości Środowiska uruchomieniowego systemu Windows. Pierwszeństwo wartości właściwości zależności istnieje, aby system właściwości Środowiska uruchomieniowego systemu Windows mógł obliczyć wartości w przewidywalny sposób i ważne jest, aby zapoznać się również z podstawową kolejnością pierwszeństwa. W przeciwnym razie możesz znaleźć się w sytuacji, w której próbujesz ustawić właściwość na jednym poziomie pierwszeństwa, ale coś innego (system, zewnętrzne wywołania, część własnego kodu) ustawia ją na innym poziomie, a ty będziesz sfrustrowany próbując ustalić, która wartość właściwości jest używana i skąd pochodzi ta wartość.
Na przykład style i szablony mają być wspólnym punktem wyjścia do ustanawiania wartości właściwości, a przez to wyglądu kontrolki. Jednak w konkretnym wystąpieniu kontrolki warto zmienić jego wartość w porównaniu ze wspólną wartością szablonu, taką jak nadanie tej kontrolce innego koloru tła lub innego ciągu tekstowego jako zawartości. System właściwości Środowiska uruchomieniowego systemu Windows uwzględnia wartości lokalne o wyższym priorytecie niż wartości udostępniane przez style i szablony. Umożliwia to sytuację, w której wartości specyficzne dla aplikacji nadpisują szablony, co sprawia, że kontrolki są użyteczne dla twojego własnego interfejsu użytkownika aplikacji.
Lista priorytetu właściwości zależności
Poniżej przedstawiono ostateczną kolejność, która jest używana przez system właściwości podczas przypisywania wartości czasu wykonywania dla właściwości zależności. Najwyższy priorytet jest wymieniony jako pierwszy. Bardziej szczegółowe wyjaśnienia znajdziesz po prostu obok tej listy.
- Animowane wartości: Aktywne animacje, animacje stanów wizualnych lub animacje z zachowaniem HoldEnd. Aby mieć jakikolwiek praktyczny efekt, animacja zastosowana do właściwości musi mieć pierwszeństwo przed wartością podstawową (nieanimowaną), nawet jeśli ta wartość została ustawiona lokalnie.
- Wartość lokalna: Wartość lokalna może być ustawiona dzięki mechanizmowi otoki właściwości, co odpowiada ustawieniu jako atrybut lub element właściwości w języku XAML, lub przez wywołanie metody SetValue przy użyciu właściwości określonego wystąpienia. Jeśli ustawisz wartość lokalną przy użyciu powiązania lub zasobu statycznego, każdy z nich działa w pierwszeństwie tak, jakby wartość lokalna została ustawiona, a powiązania lub odwołania do zasobów są usuwane, jeśli ustawiono nową wartość lokalną.
- Właściwości szablonu: Element ma te wartości, jeśli został utworzony jako część szablonu (na podstawie elementu ControlTemplate lub DataTemplate).
- Ustawienia stylu: Wartości z Setter w ramach stylów z zasobów strony lub aplikacji.
- Wartość domyślna: Właściwość zależności może mieć wartość domyślną w ramach metadanych.
Właściwości szablonu
Właściwości szablonu jako element pierwszeństwa nie mają zastosowania do żadnej właściwości elementu zadeklarowanego bezpośrednio w znaczniku strony XAML. Koncepcja właściwości szablonu istnieje tylko dla obiektów, które są tworzone, gdy środowisko uruchomieniowe systemu Windows stosuje szablon XAML do elementu interfejsu użytkownika, a tym samym definiuje jego wizualizacje.
Wszystkie właściwości ustawione na podstawie szablonu kontrolki mają jakieś wartości. Te wartości są prawie podobne do rozszerzonego zestawu wartości domyślnych dla kontrolki i są często skojarzone z wartościami, które można zresetować później, ustawiając wartości właściwości bezpośrednio. W związku z tym wartości zestawu szablonów muszą być rozróżnialne od prawdziwej wartości lokalnej, aby każda nowa wartość lokalna mogła go zastąpić.
Uwaga / Notatka
W niektórych przypadkach szablon może zastąpić nawet wartości lokalne, jeśli szablon nie może uwidocznić odwołań rozszerzenia znaczników {TemplateBinding} dla właściwości, które powinny zostać ustawione w wystąpieniach. Zwykle odbywa się to tylko wtedy, gdy właściwość nie ma być ustawiona na wystąpieniach, na przykład jeśli jest ona istotna tylko dla wizualizacji i zachowania szablonu, a nie do zamierzonej funkcji lub logiki środowiska uruchomieniowego kontrolki korzystającej z szablonu.
Powiązania i pierwszeństwo
Operacje wiązania mają odpowiednie pierwszeństwo w dowolnym zakresie, w którym są używane. Na przykład element {Binding} zastosowany do wartości lokalnej działa jako wartość lokalna, a rozszerzenie znaczników {TemplateBinding} używane do ustawiania właściwości działa podobnie jak ustawianie stylu. Ponieważ powiązania muszą czekać do czasu wykonywania w celu uzyskania wartości ze źródeł danych, proces określania pierwszeństwa wartości właściwości dla dowolnej właściwości rozciąga się również na czas wykonywania.
Powiązania nie tylko działają w tym samym pierwszeństwie co wartość lokalna, ale są naprawdę wartością lokalną, gdzie powiązanie jest symbolem zastępczym wartości odroczonej. Jeśli masz już istniejące powiązanie dla wartości właściwości i ustawisz dla niej wartość lokalną podczas wykonywania, to całkowicie zastąpi ono to powiązanie. Podobnie, jeśli wywołasz metodę SetBinding , aby zdefiniować powiązanie, które istnieje tylko w czasie wykonywania, zastąpisz dowolną wartość lokalną, która mogła zostać zastosowana w języku XAML lub z wcześniej wykonanym kodem.
Animacje na podstawie scenorysów i wartość podstawowa
Animacje scenorysowe działają na koncepcji wartości podstawowej. Wartość bazowa jest wartością, która jest określana przez system właściwości przy użyciu priorytetu, ale pomijając ten ostatni krok sprawdzania animacji. Na przykład wartość podstawowa może pochodzić z szablonu kontrolki lub może pochodzić z ustawiania wartości lokalnej na wystąpieniu kontrolki. Tak czy inaczej zastosowanie animacji spowoduje zastąpienie tej wartości bazowej i zastosowanie animowanej wartości tak długo, jak animacja będzie nadal działać.
W przypadku właściwości animowanej wartość podstawowa może nadal mieć wpływ na zachowanie animacji, jeśli ta animacja nie określa jawnie wartości Od i Do lub jeśli animacja przywraca właściwość do wartości podstawowej po zakończeniu. W takich przypadkach, gdy animacja nie jest już uruchomiona, reszta pierwszeństwa jest używana ponownie.
Jednak animacja określająca zachowanie To z zachowaniem HoldEnd może zastąpić wartość lokalną do momentu usunięcia animacji, nawet gdy wizualnie wydaje się zostać zatrzymana. Koncepcyjnie jest to animacja, która jest uruchomiona na zawsze, nawet jeśli nie ma animacji wizualnej w interfejsie użytkownika.
Do jednej właściwości można zastosować wiele animacji. Każda z tych animacji mogła zostać zdefiniowana w celu zastąpienia wartości podstawowych, które pochodzą z różnych punktów pierwszeństwa wartości. Jednak wszystkie te animacje będą uruchamiane jednocześnie w czasie wykonywania i często oznacza to, że muszą łączyć swoje wartości, ponieważ każda animacja ma równy wpływ na wartość. Zależy to od dokładnego sposobu definiowania animacji oraz typu animowanej wartości.
Aby uzyskać więcej informacji, zobacz Animacje scenorysowane.
Wartości domyślne
Ustanowienie wartości domyślnej dla właściwości zależności z wartością PropertyMetadata wyjaśniono bardziej szczegółowo w temacie Właściwości zależności niestandardowych .
Właściwości zależności nadal mają wartości domyślne, nawet jeśli te wartości domyślne nie zostały jawnie zdefiniowane w metadanych tej właściwości. O ile nie zostały zmienione przez metadane, wartości domyślne właściwości zależności środowiska uruchomieniowego systemu Windows są zazwyczaj jednym z następujących elementów:
- Właściwość używająca obiektu w czasie wykonywania lub podstawowego typu obiektu (typu odwołania) ma wartość domyślną null. Na przykład DataContext jest null, dopóki nie zostanie celowo ustawiony lub dziedziczony.
- Właściwość używająca wartości podstawowej, takiej jak liczby lub wartość logiczna ( typ wartości) używa oczekiwanej wartości domyślnej dla tej wartości. Na przykład 0 dla liczb całkowitych i liczb zmiennoprzecinkowych, false dla wartości logicznej.
- Właściwość używająca struktury środowiska uruchomieniowego systemu Windows ma wartość domyślną uzyskaną przez wywołanie niejawnego konstruktora domyślnego tej struktury. Ten konstruktor używa wartości domyślnych dla każdego z podstawowych pól wartości struktury. Na przykład domyślna wartość punktu jest inicjowana z wartościami X i Y jako 0.
- Właściwość używająca wyliczenia ma wartość domyślną pierwszego zdefiniowanego składnika w tym wyliczeniu. Sprawdź odwołanie do określonych wyliczeń, aby zobaczyć, jaka jest wartość domyślna.
- Właściwość używająca ciągu (System.String dla platformy .NET, Platform::String dla języka C++/CX) ma wartość domyślną pustego ciągu ("".).
- Właściwości kolekcji nie są zwykle implementowane jako właściwości zależności, z powodów omówionych dalej w tym temacie. Jeśli jednak zaimplementujesz właściwość kolekcji niestandardowej i chcesz, aby była to właściwość zależności, pamiętaj, aby uniknąć niezamierzonego singletona, jak opisano pod koniec właściwości zależności niestandardowej.
Funkcje właściwości udostępniane przez właściwość zależności
Powiązanie danych
Właściwość zależności może mieć jej wartość ustawioną przez zastosowanie powiązania danych. Użycie powiązania danych w XAML odbywa się przy użyciu składni rozszerzenia znaczników {Binding}, rozszerzenia znaczników {x:Bind} lub klasy Binding w kodzie. W przypadku właściwości powiązanej z danymi, ostateczne określenie wartości właściwości jest odroczone do czasu wykonania. W tym czasie wartość jest uzyskiwana ze źródła danych. Rola, jaką odgrywa tutaj system właściwości zależności, polega na umożliwieniu zastosowania zachowania jako symbolu zastępczego dla operacji takich jak ładowanie XAML, gdy wartość nie jest jeszcze znana, a następnie dostarczeniu wartości w czasie wykonywania poprzez interakcję z aparatem powiązań danych środowiska Windows Runtime.
W poniższym przykładzie ustawiono wartość Text dla elementu TextBlock przy użyciu powiązania w języku XAML. Powiązanie używa dziedziczonego kontekstu danych i źródła danych obiektu. (Żaden z tych elementów nie jest wyświetlany w skróconym przykładzie; aby uzyskać bardziej kompletny przykład pokazujący kontekst i źródło, zobacz Powiązanie danych w głębi systemu).
<Canvas>
<TextBlock Text="{Binding Team.TeamName}"/>
</Canvas>
Można również ustanowić powiązania przy użyciu kodu, a nie XAML. Zobacz SetBinding.
Uwaga / Notatka
Powiązania takie jak te są traktowane jako wartość lokalna dla celów pierwszeństwa wartości właściwości zależności. Jeśli ustawisz inną wartość lokalną dla właściwości, która pierwotnie posiadała wartość powiązania , całkowicie zastąpisz powiązanie, a nie tylko wartość czasu wykonywania powiązania. {x:Bind} Powiązania są implementowane przy użyciu wygenerowanego kodu, który ustawi lokalną wartość dla właściwości. Jeśli ustawisz wartość lokalną dla właściwości używającej elementu {x:Bind}, ta wartość zostanie zamieniona przy następnym obliczeniu powiązania, na przykład podczas obserwowania zmiany właściwości w jego obiekcie źródłowym.
Źródła powiązań, cele powiązań, rola FrameworkElement
Aby być źródłem powiązania, właściwość nie musi być właściwością zależności; Zazwyczaj można użyć dowolnej właściwości jako źródła powiązania, chociaż zależy to od języka programowania i każdy z nich ma pewne przypadki brzegowe. Jednak aby być obiektem docelowym rozszerzenia znaczników {Binding} lub powiązania, ta właściwość musi być właściwością zależności. {x:Bind} nie ma tego wymagania, ponieważ używa wygenerowanego kodu do zastosowania wartości powiązania.
Jeśli tworzysz powiązanie w kodzie, pamiętaj, że interfejs API SetBinding jest zdefiniowany tylko dla elementu FrameworkElement. Można jednak utworzyć definicję powiązania przy użyciu metody BindingOperations , a tym samym odwołać się do dowolnej właściwości DependencyObject .
W przypadku kodu lub XAML należy pamiętać, że właściwość DataContext jest właściwością FrameworkElement . Korzystając z formy dziedziczenia właściwości nadrzędny-podrzędny (zwykle ustanowionej w znacznikach XAML), system powiązań może rozpoznać DataContext, który jest ustawiony na elemencie nadrzędnym. To dziedziczenie może ocenić, nawet jeśli obiekt podrzędny (który ma właściwość docelową) nie jest elementem FrameworkElement i dlatego nie przechowuje własnej wartości DataContext . Jednak dziedziczony element nadrzędny musi być elementem FrameworkElement w celu ustawienia i przechowywania elementu DataContext. Alternatywnie należy zdefiniować powiązanie, tak aby można było działać z wartością null dla elementu DataContext.
Konfigurowanie powiązania danych to nie wszystko, czego potrzeba dla większości scenariuszy wiązania danych. Aby powiązanie jednokierunkowe lub dwukierunkowe było skuteczne, właściwość źródłowa musi obsługiwać powiadomienia o zmianie, które są propagowane do systemu powiązania, a tym samym celu. W przypadku niestandardowych źródeł powiązań oznacza to, że właściwość musi być właściwością zależności lub obiekt musi obsługiwać właściwość INotifyPropertyChanged. Kolekcje powinny obsługiwać INotifyCollectionChanged. Niektóre klasy obsługują te interfejsy w swoich implementacjach, aby były przydatne jako klasy podstawowe dla scenariuszy powiązań danych; przykładem takiej klasy jest ObservableCollection<T>. Aby uzyskać więcej informacji na temat powiązania danych i powiązania danych z systemem właściwości, zobacz Powiązanie danych w głębi systemu.
Uwaga / Notatka
Wymienione tutaj typy obsługują źródła danych platformy Microsoft .NET. Źródła danych C++/CX używają różnych interfejsów do powiadamiania o zmianie lub obserwowanego zachowania, zobacz Szczegółowe powiązanie danych.
Style i szablony
Style i szablony to dwa scenariusze dotyczące właściwości zdefiniowanych jako właściwości zależności. Style są przydatne w przypadku ustawiania właściwości definiujących interfejs użytkownika aplikacji. Style są definiowane jako zasoby w języku XAML— jako wpis w kolekcji Resources lub w oddzielnych plikach XAML, takich jak słowniki zasobów motywu. Style wchodzą w interakcję z systemem właściwości, ponieważ zawierają ustawienia dla właściwości. Najważniejszą właściwością kontrolki jest właściwość Control.Template: definiuje ona większość wyglądu i stanu wizualnego kontrolki. Aby uzyskać więcej informacji na temat stylów i przykładowego kodu XAML definiującego styl i używającego metod ustawiających, zobacz Kontrolki stylów.
Wartości pochodzące ze stylów lub szablonów są wartościami odroczonymi, podobnie jak powiązania. Dzięki temu użytkownicy mogą ponownie szablonować kontrolki lub ponownie zdefiniować style. Dlatego ustawienia właściwości w stylach mogą działać tylko na właściwościach zależności, a nie na zwykłych właściwościach.
Animacje scenorysowe
Można animować wartość właściwości zależności przy użyciu animacji scenorysu. Animacje storyboardowe w środowisku uruchomieniowym systemu Windows nie są wyłącznie dekoracjami wizualnymi. Bardziej przydatne jest myślenie o animacjach jako o technice maszyny stanów, która może ustawiać wartości poszczególnych właściwości lub wszystkich właściwości i wizualnych aspektów kontrolki oraz zmieniać te wartości z upływem czasu.
Aby można było animować, właściwość docelowa animacji musi być właściwością zależności. Ponadto, aby można było zastosować animację, typ wartości właściwości, którą chcemy animować, musi być obsługiwany przez jeden z istniejących typów animacji pochodnych od Timeline. Wartości koloru, Double i Point można animować przy użyciu technik interpolacji lub klatek kluczowych. Większość innych wartości można animować przy użyciu dyskretnych ramek klucza obiektu .
Gdy animacja jest stosowana i uruchamiana, animowana wartość działa na wyższym priorytecie niż jakakolwiek wartość (na przykład wartość lokalna), którą właściwość ma w inny sposób. Animacje mają również opcjonalne zachowanie HoldEnd , które może spowodować, że animacje mają zastosowanie do wartości właściwości, nawet jeśli animacja wizualnie wydaje się zostać zatrzymana.
Zasada maszyny stanowej jest ucieleśniona poprzez wykorzystanie animacji scenorysowanych jako części modelu stanu VisualStateManager dla kontrolek. Aby uzyskać więcej informacji na temat animacji scenorysowych, zobacz Animacje scenorysowe. Aby uzyskać więcej informacji na temat VisualStateManager i definiowania stanów wizualnych dla kontrolek, zobacz animacje z użyciem scenorysów dla stanów wizualnych lub Szablony kontrolek.
Zachowanie przy zmianie właściwości
Zachowanie zmiany właściwości jest źródłem "zależności" w terminologii właściwości zależności. Utrzymywanie prawidłowych wartości właściwości, gdy inna właściwość może mieć wpływ na wartość pierwszej właściwości, jest trudnym problemem programistycznym w wielu strukturach. W systemie właściwości Środowiska uruchomieniowego systemu Windows każda właściwość zależności może określać wywołanie zwrotne wywoływane za każdym razem, gdy zmienia się jego wartość właściwości. To wywołanie zwrotne może służyć do powiadamiania lub zmieniania powiązanych wartości właściwości w sposób ogólnie synchroniczny. Wiele istniejących właściwości zależnościowych ma zachowanie reagujące na zmiany. Możesz również dodać podobne zachowanie obsługi wywołań zwrotnych do niestandardowych właściwości zależności oraz zaimplementować własne wywołania zwrotne reagujące na zmiany właściwości. Zobacz Właściwości zależności niestandardowych , aby zapoznać się z przykładem.
System Windows 10 wprowadza metodę RegisterPropertyChangedCallback . Dzięki temu kod aplikacji może rejestrować powiadomienia o zmianie, gdy określona właściwość zależności zostanie zmieniona w wystąpieniu obiektu DependencyObject.
Wartość domyślna i ClearValue
Właściwość zależności może mieć wartość domyślną zdefiniowaną jako część metadanych właściwości. W przypadku właściwości zależności jej wartość domyślna nie staje się nieistotna po ustawieniu właściwości po raz pierwszy. Wartość domyślna może być stosowana ponownie w czasie wykonywania, gdy znika jakiś inny element określający pierwszeństwo wartości. (Pierwszeństwo wartości właściwości zależności omówiono w następnej sekcji). Na przykład możesz celowo usunąć wartość stylu lub animację, która ma zastosowanie do właściwości, ale wartość ma być rozsądną wartością domyślną po wykonaniu tej czynności. Wartość domyślna właściwości zależności może podać tę wartość bez konieczności ustawiania wartości każdej właściwości jako dodatkowego kroku.
Właściwość można celowo ustawić na wartość domyślną nawet po ustawieniu jej przy użyciu wartości lokalnej. Aby zresetować wartość do ustawienia domyślnego i umożliwić innym elementom priorytetu zastąpienie domyślnej wartości, ale nie wartości lokalnej, wywołaj metodę ClearValue (wskazując właściwość do wyczyścić jako parametr metody). Nie zawsze zależy Ci na tym, aby właściwość dosłownie korzystała z wartości domyślnej. Jednak wyczyszczenie wartości lokalnej i powrót do wartości domyślnej może umożliwić zastosowanie innego elementu o wyższej priorytetowości, który powinien teraz zacząć działać, na przykład wykorzystując wartość pochodzącą z ustawienia stylu w szablonie kontrolnym.
DependencyObject i wątkowanie
Wszystkie wystąpienia obiektu DependencyObject należy utworzyć w wątku interfejsu użytkownika, który jest skojarzony z bieżącym oknem wyświetlanym przez aplikację Środowiska uruchomieniowego systemu Windows. Mimo że każdy obiekt DependencyObject musi zostać utworzony w głównym wątku interfejsu użytkownika, dostęp do obiektów można uzyskać przy użyciu odwołania dyspozytora z innych wątków, korzystając z właściwości DispatcherQueue . Następnie można wywołać metody, takie jak TryEnqueue, i wykonać kod zgodnie z zasadami ograniczeń dotyczących wątków na wątku interfejsu użytkownika.
Uwaga / Notatka
W przypadku aplikacji platformy UWP uzyskaj dostęp do właściwości Dispatcher . Następnie można wywołać metody, takie jak RunAsync w obiekcie CoreDispatcher i wykonać kod zgodnie z zasadami ograniczeń wątku na wątku interfejsu użytkownika. Aby uzyskać więcej informacji na temat różnic między platformami UWP i WinUI dla zestawu SDK aplikacji systemu Windows, zobacz Migracja funkcji wątkowości.
Aspekty wątkowe obiektu DependencyObject są istotne, ponieważ zazwyczaj oznacza to, że tylko kod uruchamiany w wątku interfejsu użytkownika może ulec zmianie, a nawet odczytać wartość właściwości zależności. Problemy z wątkami można zwykle uniknąć w typowym kodzie interfejsu użytkownika przy poprawnym użyciu wzorców asynchronicznych i wątków roboczych w tle. Zazwyczaj natrafiasz na problemy z wątkami związanymi z DependencyObject, jeśli definiujesz własne typy DependencyObject i próbujesz ich używać w przypadku źródeł danych lub innych scenariuszy, gdzie DependencyObject nie jest koniecznie odpowiedni.
Tematy pokrewne
Materiał koncepcyjny
- Właściwości zależności niestandardowych
- Omówienie dołączonych właściwości
- Szczegółowe powiązanie danych
- animacje scenorysowe
API związane z właściwościami zależności
Windows developer