2010-10-26 4 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> 

Ich werde versuchen, meine Frage klar zu erklären. Der Name des Storyboard-Ziels, wenn es "ItemBorder" (die auskommentierte Zeile) ist, arbeitet zeitweise. Manchmal bekomme ich einen Fehler, dass der Name "ItemBorder" nicht im Bereich gefunden werden kann.Was ist die Bedeutung von x: Name in xaml (WPF) und seine Verwendung mit Storyboard

Ich habe mich entschieden, einem Stil aus einem MSDN-Beispiel zu folgen und die Farbeigenschaft direkt im Pinsel zu ändern, anstatt das Ziel des Storyboards als Rahmen zu definieren und die Farbe des Rahmens nach Eigenschaft zu ändern (die auskommentierte Zeile). Dies scheint zu funktionieren.

Allerdings ist Name="ItemBorderBrush" nicht kompiliert, da Name keine Eigenschaft von SolidColorBrush ist so verwende ich x:Name="ItemBorderBrush" Sowohl Name und x:Name für die Border akzeptiert. Warum ist das?

Was bedeutet das x: (wie x:Name unterscheidet sich von Name ist), und warum sollte mit der Name Eigentum der Grenze nur manchmal mit dem Storyboard arbeiten?

+0

siehe auch [In WPF, was sind die Unterschiede zwischen dem x: Name und Name Attribute] (http://stackoverflow.com/questions/589874/in-wpf-what-are- the-differences-zwischen-x-name und name-attribute –

Antwort

4

Der x: Präfix ist einfach ein Attribut aus einem separaten Namespace Einstellung:

Innerhalb der Namespace-Deklarationen in den Root-Tag vielen XAML-Dateien, Sie werden sehen, dass es in der Regel zwei XML Namespace-Deklarationen sind . Die erste Erklärung bildet die gesamte WPF Client/Framework XAML-Namespace als den Standard:

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

Die zweite Die Deklaration bildet einen separaten XAML-Namespace ab und ordnet ihn (typischerweise) dem Präfix x: zu.

Xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml"

Die Beziehung zwischen diesen Erklärungen ist, dass die x: prefix Abbilden der intrinsics unterstützt, dass Teil sind der XAML-Sprache Definition, und WPF ist eine Implementierung, die XAML als Sprache verwendet und definiert ein Vokabular von seine Objekte für XAML. Da die WPF Vokabular des Verwendungen weit mehr gemeinsam als die XAML-Spezifika Verwendungen sein, wird die WPF Vokabular als Standard abgebildet

Also, der Grund, dass Name und x:Name arbeiten beide auf Border ist, weil Border hat eine Eigenschaft namens Name. Es unterstützt auch die XAML Intrinsic-Verwendung von x:Name (die WPF verwendet, um die benannte Instanz der Klasse zu erstellen).

SolidColorBrush hat jedoch nicht die Eigenschaft Name, so dass nur die Verwendung von XAML Intrinsic x:Name unterstützt wird.

1

Es gibt wirklich nur einen Namen in XAML, der x: Name.Ein Framework wie WPF kann optional eine seiner Eigenschaften dem x: Name von XAML zuordnen, indem das RuntimeNamePropertyAttribute für die Klasse verwendet wird, die eine der Klasseneigenschaften als Zuordnung zum x: Name-Attribut von XAML angibt.

Der Grund dafür war, Frameworks zuzulassen, die bereits zur Laufzeit ein Konzept von "Name" haben, wie beispielsweise WPF. In WPF beispielsweise führt FrameworkElement eine Name-Eigenschaft ein.

Im Allgemeinen muss eine Klasse den Namen für x nicht speichern: Name, der verwendet werden kann. Alle x: Name bedeutet, dass XAML ein Feld zum Speichern des Werts im Code hinter der Klasse generiert. Was die Laufzeit mit dieser Zuordnung macht, ist Framework-abhängig.

Also, warum gibt es zwei Möglichkeiten, das Gleiche zu tun? Die einfache Antwort, weil zwei Konzepte auf eine Eigenschaft abgebildet sind. WPF möchte, dass der Name eines Elements zur Laufzeit beibehalten wird (was unter anderem durch Bind möglich ist), und XAML muss wissen, auf welche Elemente die Felder im Code hinter der Klasse zugreifen sollen. WPF verbindet diese beiden miteinander, indem die Eigenschaft Name als Alias ​​von x: Name markiert wird.

In Zukunft wird XAML mehr für x: Name verwenden, so dass Sie Eigenschaften festlegen können, indem Sie auf andere Objekte über den Namen verweisen, aber in 3.5 und vorher wird es nur zum Erstellen von Feldern verwendet.

Ob Sie das eine oder das andere verwenden sollten, ist wirklich eine Stilfrage, keine technische Frage. Ich werde das für eine Empfehlung anderen überlassen.

Siehe auch AutomationProperties.Name VS x: Name, AutomationProperties.Name wird von Eingabehilfen und einigen Testtools verwendet.

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