Witajcie, wśród atrybutów kontrolek w WPF-ie przewijają się takie które wykorzystują:
x:Key="..."
Oraz takie wymagające:
x:Name="..."
Jaka jest różnica i jak wywnioskować, którego atrybutu użyć przy danej kontrolce?
Witajcie, wśród atrybutów kontrolek w WPF-ie przewijają się takie które wykorzystują:
x:Key="..."
Oraz takie wymagające:
x:Name="..."
Jaka jest różnica i jak wywnioskować, którego atrybutu użyć przy danej kontrolce?
Ten temat był już omawiany wcześniej:
https://quorum.akademiq.pl/discussion/4335/roznica-miedzy-atrybutami-name-i-xname
Istotnie, wcześniej była omawiana różnica pomiędzy Name i x:Name. Natomiast mnie chodzi o x:Key używany np. w stylach:
<SolidColorBrush x:Key="ClientIDBrush" Color="Purple" x:Name="nazwaStylu"/>
Pomimo że mam obie właściwości, mogę przypisać styl tylko po x:Key:
<Grid Background="{StaticResource ClientIDBrush}">
Z czego to wynika?
Style definiowane są w słownikach zasobów na poziomie lokalnym (np. kontrolki, panelu czy kontenera), aplikacji lub w zwnętrznych słownikach zasobów.
W XAML-u jest to realizowane przez element Resources:
<Application.Resources> <SolidColorBrush x:Key="BackgroundBrush" Color="#FFBF2C2C"/> </Application.Resources>
Element Resources odpowiada deklaratywnemu odwołaniu do instancji klasy ResourceDictionary. Klasa ta jest słownikiem, a więc przechowuje pary klucz - wartość, co bezpośrednio wyjaśnia dlaczego element x:Key jest wymagany w kolekcji Resources. Przy okazji jasnym staje się, dlaczego x:Name jest niewskazane w przypadku takich zasobów - przeszukiwanie po nazwie (czyli jednym z atrybutów) obiektu w słowniku byłoby nieefektywne - znacznie szybciej zlokalizujemy zasób po kluczu. Należy przy tym pamiętać, że przeszukiwanie słowników może uwzględniać słownik lokalny, aplikacyjny oraz słowniki zewnętrzne.