ComponentResourceKey, rozszerzenie znaczników
Definiuje klucze i odwołuje się do nich dla zasobów ładowanych z zewnętrznych zestawów. Dzięki temu wyszukiwanie zasobów umożliwia określenie typu docelowego w zestawie, a nie jawnego słownika zasobów w zestawie lub w klasie.
Użycie atrybutu XAML (klucz ustawień, zwarta wersja)
<object x:Key="{ComponentResourceKey {x:Type targetTypeName}, targetID}" ... />
Użycie atrybutów XAML (ustawienie klucza, szczegółowe)
<object x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type targetTypeName}, ResourceID=targetID}" ... />
Użycie atrybutów XAML (żądanie zasobu, kompaktowanie)
<object property="{DynamicResource {ComponentResourceKey {x:Type targetTypeName}, targetID}}" ... />
Użycie atrybutu XAML (żądanie zasobu, szczegółowe)
<object property="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type targetTypeName}, ResourceID=targetID}}" ... />
Wartości XAML
Wartość | Opis |
---|---|
targetTypeName |
Nazwa typu środowiska uruchomieniowego języka wspólnego publicznego (CLR) zdefiniowanego w zestawie zasobów. |
targetID |
Klucz zasobu. Gdy zasoby są przeszukiwane, targetID będzie analogiczne do dyrektywy x:Key zasobu. |
Uwagi
Jak pokazano w powyższych użyciach, użycie rozszerzenia znaczników {ComponentResourceKey
} znajduje się w dwóch miejscach:
Definicja klucza w słowniku zasobów motywu, podana przez autora kontroli.
Uzyskiwanie dostępu do zasobu motywu z zestawu podczas przedefiniowania kontrolki, jednocześnie chcąc użyć wartości właściwości pochodzących z zasobów dostarczonych przez motywy tej kontrolki.
W przypadku odwoływania się do zasobów składników pochodzących z motywów zaleca się używanie {DynamicResource}
zamiast {StaticResource}
. To jest pokazane w użyciach.
{DynamicResource}
jest zalecane, ponieważ sam motyw może zostać zmieniony przez użytkownika. Jeśli chcesz, aby zasób komponentu jak najdokładniej odpowiadał intencji autora kontrolki dotyczącej obsługi motywu, powinieneś również włączyć dynamiczność swojego odwołania do zasobów komponentu.
TypeInTargetAssembly identyfikuje typ, który istnieje w zestawie docelowym, w którym faktycznie zdefiniowano zasób. Można zdefiniować i używać ComponentResourceKey
niezależnie od dokładnej wiedzy, gdzie zdefiniowano TypeInTargetAssembly, ale ostatecznie należy określić typ poprzez odwołanie do powiązanych zestawów.
Typowym zastosowaniem ComponentResourceKey jest zdefiniowanie kluczy, które są następnie udostępniane jako elementy członkowskie klasy. W przypadku tego użycia należy użyć konstruktora klasy ComponentResourceKey, a nie rozszerzenia znaczników. Aby uzyskać więcej informacji, zobacz ComponentResourceKeylub sekcję "Definiowanie i odwoływanie się do kluczy dla zasobów motywu" w temacie Omówienie tworzenia kontrolek.
W przypadku ustanawiania kluczy i odwoływania się do kluczowych zasobów składnia atrybutów jest często używana dla rozszerzenia znaczników ComponentResourceKey
.
Pokazana składnia kompaktowa opiera się na sygnaturze konstruktora ComponentResourceKey oraz użyciu parametrów pozycyjnych rozszerzenia składni. Ważna jest kolejność, w jakiej podano targetTypeName
i targetID
. Składnia szczegółowa opiera się na konstruktorze bez parametrów ComponentResourceKey, a następnie ustawia TypeInTargetAssembly i ResourceId w sposób analogiczny do prawdziwej składni atrybutu elementu obiektu. W składni pełnej kolejność ustawiania właściwości nie jest ważna. Związek i mechanizmy tych dwóch alternatyw (zwięzły i szczegółowy) opisano bardziej szczegółowo w temacie Rozszerzenia znaczników i WPF XAML.
Technicznie wartość targetID
może być dowolnym obiektem, ale nie musi być ciągiem. Jednak najczęstszym zastosowaniem w WPF jest wyrównanie wartości targetID
z formularzami, które są ciągami, i gdzie takie ciągi są prawidłowe w XamlName Grammar.
ComponentResourceKey
można użyć w składni elementu obiektu. W takim przypadku określenie wartości właściwości TypeInTargetAssembly i ResourceId jest wymagane do prawidłowego zainicjowania rozszerzenia.
W implementacji czytnika XAML WPF obsługa tego rozszerzenia znaczników jest definiowana przez klasę ComponentResourceKey.
ComponentResourceKey
jest rozszerzeniem znaczników. Rozszerzenia znaczników są zwykle implementowane, gdy istnieje potrzeba zmiany interpretacji wartości atrybutów na inne niż wartości bezpośrednio określone lub nazwy obsług, a to zapotrzebowanie jest bardziej globalne niż stosowanie konwerterów typów dla pewnych typów lub właściwości. Wszystkie rozszerzenia znaczników w języku XAML używają znaków { i } w ich składni atrybutu, która jest konwencją, zgodnie z którą procesor XAML rozpoznaje, że rozszerzenie znaczników musi przetworzyć atrybut. Aby uzyskać więcej informacji, zobacz Rozszerzenia znaczników i WPF XAML.
Zobacz też
- ComponentResourceKey
- ControlTemplate
- Tworzenie i zarządzanie kontrolkami — omówienie
- XAML w WPF
- Rozszerzenia znaczników i WPF XAML
.NET Desktop feedback