2010-10-26 5 views
5
<Border Name="ItemBorder" Margin="5 5 0 5" BorderBrush="Black" BorderThickness="1" Height="75" Width="75"> 
    <Border.Background> 
    <SolidColorBrush x:Name="ItemBorderBrush" Color="LightBlue"/> 
    </Border.Background> 
    <ContentPresenter/> 
</Border> 
<ControlTemplate.Triggers> 
    <EventTrigger RoutedEvent="someEvent"> 
    <BeginStoryboard> 
     <Storyboard TargetName="ItemBorderBrush" TargetProperty="Color" Duration="0:0:1" > 
     <!--Storyboard TargetName="ItemBorder" TargetProperty="Background.Color" Duration="0:0:1"> --> 
     <ColorAnimation To="White"/> 
     </Storyboard> 
    </BeginStoryboard> 
    </EventTrigger> 
</ControlTemplate.Triggers> 

Postaram się wyjaśnić wyraźnie moje pytanie. Nazwa celu Storyboard, gdy jest to "ItemBorder" (skomentowana linia wyjściowa) działa sporadycznie. Czasami pojawia się błąd, że nazwy "ItemBorder" nie można znaleźć w zakresie.Co to jest x: Nazwa w języku xaml (WPF) i jego użycie w Storyboard

Postanowiłem zastosować styl z przykładu MSDN tego i zmienić właściwość koloru bezpośrednio na pędzlu, zamiast mieć cel scenorysu jako obramowanie i zmieniać kolor pędzla granicy według właściwości (skomentowana linia). To wydaje się działać.

Jednak Name="ItemBorderBrush" nie kompiluje bo Name nie jest właściwością SolidColorBrush więc używam x:Name="ItemBorderBrush" Zarówno Name i x:Name są akceptowane na granicy. Dlaczego to?

Czego x: myśli (jak to x:Name różni się od Name) i dlaczego mający własność granicy Name pracować tylko z ujęć czasami?

+0

patrz także [w WPF, jakie są różnice między X:? Imię i Nazwisko atrybutów] (http://stackoverflow.com/questions/589874/in-wpf-what-are- atrybuty "differ-between-the-xname-and-name") –

Odpowiedz

4

x: prefiks jest po prostu ustawiając atrybut z przestrzeni nazw oddzielnym:

ciągu deklaracji przestrzeni nazw w tag źródłem wielu plikach XAML, będzie zobaczyć, że nie są zwykle dwie deklaracje przestrzeni nazw XML . Pierwszy deklaracja mapy ogólnej WPF klient/ramową nazw XAML jako domyślne:

xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"

drugim deklaracja odwzorowuje oddzielny obszar nazw XAML , mapując go (zazwyczaj) na prefiks x:

xmlns: X = "http://schemas.microsoft.com/winfx/2006/xaml"

Związek tych zgłoszeń że x: mapowanie prefiks obsługuje intrinsics że wchodzą Definicja języka XAML i definicja WPF to jedna implementacja , która używa języka XAML jako języka i definiuje słownik jego obiektów dla XAML. Ponieważ zwyczaje WPF słownictwo będzie znacznie bardziej powszechne niż intrinsics XAML zwyczaje, słownictwo WPF jest odwzorowany jako domyślny

Więc powód że Name i x:Name zarówno prace nad granica jest bo Border ma właściwość o nazwie Name. Obsługuje również wewnętrzne użycie XAML x:Name (która jest używana przez WPF do tworzenia nazwanego wystąpienia klasy).

Jednak SolidColorBrush nie ma właściwości o nazwie Name, więc obsługuje tylko użycie XAML Intrinsic x:Name.

1

W XAML jest tylko jedna nazwa, x: Nazwa.Struktura taka jak WPF może opcjonalnie odwzorować jedną ze swoich właściwości na x: XAML XAML, używając klasy RuntimeNamePropertyAttribute na klasie, która wyznacza jedną z właściwości klas jako odwzorowanie na atrybut x: Name XAML.

Powodem tego było umożliwienie ram, które już mają pojęcie "Nazwa" w czasie wykonywania, takie jak WPF. W WPF na przykład FrameworkElement wprowadza właściwość Name.

Ogólnie rzecz biorąc, klasa nie musi zapisywać nazwy dla x: Nazwa, aby była użyteczna. Wszystkie x: Nazwa oznacza XAML jest generowane pole do przechowywania wartości w kodzie za klasy. To, co robi środowisko wykonawcze z tym odwzorowaniem, zależy od struktury.

Dlaczego istnieją dwa sposoby na to samo? Prosta odpowiedź, ponieważ istnieją dwie koncepcje przypisane do jednej właściwości. WPF chce zachować nazwę elementu zachowanego w środowisku wykonawczym (które można wykorzystać między innymi przez Bind), a XAML musi wiedzieć, jakie elementy mają być dostępne przez pola w kodzie za klasą. WPF łączy te dwa elementy, zaznaczając właściwość Name jako alias x: Name.

W przyszłości XAML będzie miał więcej zastosowań dla x: Nazwa, na przykład pozwalając ustawić właściwości, odwołując się do innych obiektów po nazwie, ale w wersjach 3.5 i wcześniej służy tylko do tworzenia pól.

To, czy powinieneś używać jednego czy drugiego, jest naprawdę kwestią stylu, a nie techniczną. Zostawię to innym za rekomendację.

Zobacz także AutomationProperties.Name VS x: Name, AutomationProperties.Name jest używany przez narzędzia ułatwień dostępu i niektóre narzędzia do testowania.

odnoszą In WPF, what are the differences between the x:Name and Name attributes?