Cenni preliminari su XAML (WPF)XAML overview (WPF)

Questo argomento descrive le funzionalità del linguaggio XAML e ne illustra l'uso per la scrittura di applicazioni Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF).This topic describes the features of the XAML language and demonstrates how you can use XAML to write Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) applications. In particolare descrive il linguaggio XAML implementato in WPFWPF.This topic specifically describes XAML as implemented by WPFWPF. Il linguaggio XAML in quanto tale, tuttavia, rappresenta un concetto di linguaggio più ampio rispetto a quello implementato in WPFWPF.XAML itself is a larger language concept than WPFWPF.

Definizione di XAMLWhat is XAML?

XAML è un linguaggio di markup dichiarativo.XAML is a declarative markup language. Quando applicato al modello di programmazione .NET Framework, XAML semplifica la creazione di un Interfaccia utenteUI per un'applicazione .NET Framework.As applied to the .NET Framework programming model, XAML simplifies creating a Interfaccia utenteUI for a .NET Framework application. È possibile creare elementi di Interfaccia utenteUI visibili nel markup XAML dichiarativo, quindi separare la definizione di Interfaccia utenteUI dalla logica di runtime usando file code-behind, uniti al markup tramite definizioni di classe parziali.You can create visible Interfaccia utenteUI elements in the declarative XAML markup, and then separate the Interfaccia utenteUI definition from the run-time logic by using code-behind files, joined to the markup through partial class definitions. XAML rappresenta in modo diretto la creazione di istanze di oggetti in un set specifico di tipi di supporto definiti in assembly.XAML directly represents the instantiation of objects in a specific set of backing types defined in assemblies. In ciò si differenzia dalla maggior parte degli altri linguaggi di markup, che sono in genere linguaggi interpretati senza un legame diretto con il sistema di tipi di supporto.This is unlike most other markup languages, which are typically an interpreted language without such a direct tie to a backing type system. XAML consente un flusso di lavoro in cui parti distinte possono operare nella Interfaccia utenteUI e nella logica di un'applicazione, usando strumenti potenzialmente diversi.XAML enables a workflow where separate parties can work on the Interfaccia utenteUI and the logic of an application, using potentially different tools.

Se rappresentati come testo, i file XAML sono file XML, in genere con estensione .xaml.When represented as text, XAML files are XML files that generally have the .xaml extension. I file possono essere codificati tramite qualsiasi codifica XML, tuttavia la codifica tipica è UTF-8.The files can be encoded by any XML encoding, but encoding as UTF-8 is typical.

L'esempio seguente illustra come creare un pulsante come parte di una Interfaccia utenteUI.The following example shows how you might create a button as part of a Interfaccia utenteUI. L'esempio non deve essere ritenuto esaustivo e ha il semplice scopo di dare un'idea molto generale del modo in cui XAML rappresenta metafore di programmazione della Interfaccia utenteUI comuni.This example is just intended to give you a flavor of how XAML represents common Interfaccia utenteUI programming metaphors (it is not a complete sample).

<StackPanel>
  <Button Content="Click Me"/>
</StackPanel>

Cenni sulla sintassi XAMLXAML syntax in brief

Le sezioni seguenti descrivono le forme di base della sintassi XAML e offrono un breve esempio di markup.The following sections explain the basic forms of XAML syntax, and give a short markup example. L'obiettivo di queste sezioni non consiste nell'offrire informazioni complete su ogni forma di sintassi, ad esempio sulla modalità di rappresentazione di queste sintassi nel sistema di tipi di supporto.These sections are not intended to provide complete information about each syntax form, such as how these are represented in the backing type system. Per altre informazioni sulle specifiche della sintassi XAML per ognuna delle forme di sintassi introdotte in questo argomento, vedere Descrizione dettagliata della sintassi XAML.For more information about the specifics of XAML syntax for each of the syntax forms introduced in this topic, see XAML Syntax In Detail.

Se si ha familiarità con il linguaggio XML, la maggior parte del materiale incluso in alcune delle sezioni successive risulterà di facile comprensione.Much of the material in the next few sections will be elementary to you, if you have previous familiarity with the XML language. Ciò è dovuto a uno dei principi di base della progettazione XAML.This is a consequence of one of the basic design principles of XAML. Il linguaggio XAML definisce concetti propri, ma questi concetti funzionano all'interno del form di lingua e il markup XML.The XAML language defines concepts of its own, but these concepts work within the XML language and markup form.

Elementi oggetto XAMLXAML object elements

In genere, un elemento oggetto dichiara un'istanza di un tipo.An object element typically declares an instance of a type. Il tipo è definito negli assembly che rendono disponibili i tipi di supporto per una tecnologia che usa XAML come linguaggio.That type is defined in the assemblies that provide the backing types for a technology that uses XAML as a language.

La sintassi degli elementi oggetto inizia sempre con una parentesi angolare di apertura (<),Object element syntax always starts with an opening angle bracket (<). seguita dal nome del tipo in cui si desidera creare un'istanza.This is followed by the name of the type where you want to create an instance. Il nome può includere un prefisso. Questo concetto verrà illustrato in seguito. Se lo si desidera, è quindi possibile dichiarare attributi nell'elemento oggetto.(The name can possibly include a prefix, a concept that will be explained later.) After this, you can optionally declare attributes on the object element. Per completare il tag dell'elemento oggetto, terminare con una parentesi angolare di chiusura (>).To complete the object element tag, end with a closing angle bracket (>). In alternativa, è possibile usare una forma di chiusura automatica senza contenuto, completando il tag con una barra e una parentesi angolare di chiusura in successione (/>).You can instead use a self-closing form that does not have any content, by completing the tag with a forward slash and closing angle bracket in succession (/>). Osservare nuovamente il frammento di markup illustrato in precedenza:For example, look at the previously shown markup snippet again:

<StackPanel>
  <Button Content="Click Me"/>
</StackPanel>

Vengono specificati due elementi oggetto: <StackPanel> (con contenuto e un tag di chiusura successivo) e <Button .../> (forma di chiusura automatica, con diversi attributi).This specifies two object elements: <StackPanel> (with content, and a closing tag later), and <Button .../> (the self-closing form, with several attributes). Gli elementi oggetto StackPanel e Button vengono mappati ciascuno al nome di una classe definita da WPFWPF e che fa parte degli assembly WPFWPF.The object elements StackPanel and Button each map to the name of a class that is defined by WPFWPF and is part of the WPFWPF assemblies. Quando si specifica il tag di un elemento oggetto, si crea un'istruzione per la creazione di una nuova istanza da parte dell'elaborazione XAML.When you specify an object element tag, you create an instruction for XAML processing to create a new instance. Ogni istanza viene creata chiamando il costruttore predefinito del tipo sottostante durante l'analisi e il caricamento del markup XAML.Each instance is created by calling the default constructor of the underlying type when parsing and loading the XAML.

Sintassi degli attributi (proprietà)Attribute syntax (properties)

Spesso le proprietà di un oggetto possono essere espresse come attributi dell'elemento oggetto.Properties of an object can often be expressed as attributes of the object element. Una sintassi per attributi definisce un nome per la proprietà impostata nella sintassi, seguito dall'operatore di assegnazione (=).An attribute syntax names the property that is being set in attribute syntax, followed by the assignment operator (=). Il valore di un attributo viene sempre specificato come stringa inclusa tra virgolette.The value of an attribute is always specified as a string that is contained within quotation marks.

La sintassi per attributi è la sintassi per l'impostazione di proprietà più semplice, nonché la più intuitiva per gli sviluppatori che hanno già usato linguaggi di markup in passato.Attribute syntax is the most streamlined property setting syntax and is the most intuitive syntax to use for developers who have used markup languages in the past. Il markup seguente, ad esempio, crea un pulsante che presenta un testo rosso e uno sfondo blu oltre a un testo visualizzato specificato come Content.For example, the following markup creates a button that has red text and a blue background in addition to display text specified as Content.

<Button Background="Blue" Foreground="Red" Content="This is a button"/>

Sintassi per elementi proprietàProperty element syntax

Per alcune proprietà di un elemento oggetto, non si può usare la sintassi per attributi in quanto non è possibile esprimere l'oggetto o le informazioni necessarie per indicare il valore di proprietà in modo adeguato tra virgolette e nel rispetto delle limitazioni della stringa della sintassi di attributo.For some properties of an object element, attribute syntax is not possible, because the object or information necessary to provide the property value cannot be adequately expressed within the quotation mark and string restrictions of attribute syntax. In questi casi, è possibile usare una sintassi diversa, nota come sintassi per elementi proprietà.For these cases, a different syntax known as property element syntax can be used.

La sintassi per il tag di inizio dell'elemento proprietà è < nomeTipo.nomeProprietà>.The syntax for the property element start tag is <typeName.propertyName>. Il contenuto di tale tag è in genere un elemento oggetto del tipo accettato come valore dalla proprietà.Generally, the content of that tag is an object element of the type that the property takes as its value . Dopo avere specificato il contenuto, è necessario chiudere l'elemento proprietà con un tag di fine.After specifying content, you must close the property element with an end tag. La sintassi per il tag di fine è </ nomeTipo.nomeProprietà>.The syntax for the end tag is </typeName.propertyName>.

Se supportata, la sintassi per attributi è in genere più efficace e consente un markup più compatto. Si tratta tuttavia di una questione di stile e non di un limite tecnico.If an attribute syntax is possible, using the attribute syntax is typically more convenient and enables a more compact markup, but that is often just a matter of style, not a technical limitation. L'esempio seguente mostra le stesse proprietà impostate nell'esempio di sintassi per attributi precedente, tuttavia questa volta viene usata la sintassi per elementi proprietà per tutte le proprietà dell'oggetto Button.The following example shows the same properties being set as in the previous attribute syntax example, but this time by using property element syntax for all properties of the Button.

<Button>
  <Button.Background>
    <SolidColorBrush Color="Blue"/>
  </Button.Background>
  <Button.Foreground>
    <SolidColorBrush Color="Red"/>
  </Button.Foreground>
  <Button.Content>
    This is a button
  </Button.Content>
</Button>

Sintassi delle raccolteCollection syntax

Il linguaggio XAML include alcune ottimizzazioni che producono un markup più leggibile per l'utente.The XAML language includes some optimizations that produce more human-readable markup. Una di queste ottimizzazioni prevede che se una proprietà specifica accetta un tipo di raccolta, gli elementi dichiarati nel markup come elementi figlio in quel valore della proprietà diventano di conseguenza parte della raccolta.One such optimization is that if a particular property takes a collection type, then items that you declare in markup as child elements within that property's value become part of the collection. In questo caso, una raccolta di elementi oggetto figlio corrisponde al valore impostato nella proprietà della raccolta.In this case a collection of child object elements is the value being set to the collection property.

L'esempio seguente illustra la sintassi di raccolta per l'impostazione di valori del GradientStops proprietà:The following example shows collection syntax for setting values of the GradientStops property:

<LinearGradientBrush>  
  <LinearGradientBrush.GradientStops>  
    <!-- no explicit new GradientStopCollection, parser knows how to find or create -->  
    <GradientStop Offset="0.0" Color="Red" />  
    <GradientStop Offset="1.0" Color="Blue" />  
  </LinearGradientBrush.GradientStops>  
</LinearGradientBrush>  

Proprietà di contenuto XAMLXAML content properties

XAML specifica una funzionalità del linguaggio tramite cui una classe può designare esattamente una delle relative proprietà come proprietà di contenuto XAML.XAML specifies a language feature whereby a class can designate exactly one of its properties to be the XAML content property. Per impostare il valore di questa proprietà di contenuto vengono usati gli elementi figlio.Child elements of that object element are used to set the value of that content property. In altre parole, solo per la proprietà di contenuto, è possibile omettere un elemento proprietà quando si imposta tale proprietà nel markup XAML ed è possibile produrre una metafora padre/figlio più visibile nel markup.In other words, for the content property uniquely, you can omit a property element when setting that property in XAML markup and produce a more visible parent/child metaphor in the markup.

Ad esempio, Border specifica una proprietà di contenuto di Child.For example, Border specifies a content property of Child. I seguenti due Border gli elementi vengono trattati in modo identico.The following two Border elements are treated identically. Il primo sfrutta la sintassi della proprietà di contenuto e omette l'elemento proprietà Border.Child.The first one takes advantage of the content property syntax and omits the Border.Child property element. Il secondo specifica Border.Child in modo esplicito.The second one shows Border.Child explicitly.

<Border>  
  <TextBox Width="300"/>  
</Border>  
<!--explicit equivalent-->  
<Border>  
  <Border.Child>  
    <TextBox Width="300"/>  
  </Border.Child>  
</Border>  

Secondo le regole del linguaggio XAML, il valore di una proprietà di contenuto XAML deve essere specificato completamente prima o completamente dopo qualsiasi altro elemento proprietà nell'elemento oggetto.As a rule of the XAML language, the value of a XAML content property must be given either entirely before or entirely after any other property elements on that object element. Ad esempio, il markup seguente non viene compilato:For instance, the following markup does not compile:

<Button>I am a   
  <Button.Background>Blue</Button.Background>  
  blue button</Button>  

Per altre informazioni su questa restrizione nelle proprietà di contenuto XAML, vedere la sezione "Proprietà di contenuto XAML" di Descrizione dettagliata della sintassi XAML.For more information about this restriction on XAML content properties, see the "XAML Content Properties" section of XAML Syntax In Detail.

Contenuto di testoText content

Un numero ridotto di elementi XAML può elaborare il testo direttamente come contenuto.A small number of XAML elements can directly process text as their content. A tale scopo, deve verificarsi uno dei casi seguenti:To enable this, one of the following cases must be true:

  • La classe deve dichiarare una proprietà di contenuto e tale proprietà di contenuto deve essere di un tipo assegnabile a una stringa (il tipo potrebbe essere Object).The class must declare a content property, and that content property must be of a type assignable to a string (the type could be Object). Ad esempio, qualsiasi ContentControl utilizza Content come proprietà di contenuto ed è di tipo Object, e questo supporta la sintassi seguente in un pratico ContentControl , ad esempio un Button: <Button>Hello</Button>.For instance, any ContentControl uses Content as its content property and it is type Object, and this supports the following usage on a practical ContentControl such as a Button: <Button>Hello</Button>.

  • Il tipo deve dichiarare un convertitore di tipi e, in tal caso, il contenuto di testo viene usato come testo di inizializzazione per il convertitore di tipi.The type must declare a type converter, in which case the text content is used as initialization text for that type converter. Ad esempio <Brush>Blue</Brush>.For example, <Brush>Blue</Brush>. Nella pratica questo caso è meno comune.This case is less common in practice.

  • Il tipo deve essere un tipo primitivo noto del linguaggio XAML.The type must be a known XAML language primitive.

Combinato sintassi di proprietà e la raccolta contenutoContent properties and collection syntax combined

Si consideri l'esempio seguente:Consider this example:

<StackPanel>  
  <Button>First Button</Button>  
  <Button>Second Button</Button>  
</StackPanel>  

In questo caso, ogni Button è un elemento figlio di StackPanel.Here, each Button is a child element of StackPanel. Si tratta di un markup semplice e intuitivo nel quale vengono omessi due tag per due ragioni diverse.This is a streamlined and intuitive markup that omits two tags for two different reasons.

  • Elemento proprietà StackPanel. Children omesso: StackPanel deriva da Panel.Omitted StackPanel.Children property element: StackPanel derives from Panel. Panel definisce Panel.Children come relativo XAML proprietà di contenuto.Panel defines Panel.Children as its XAML content property.

  • Elemento oggetto UIElementCollection omesso: il Panel.Children proprietà accetta il tipo UIElementCollection, che implementa l'interfaccia IList.Omitted UIElementCollection object element: The Panel.Children property takes the type UIElementCollection, which implements IList. Tag di elemento della raccolta può essere omesso, in base alle regole XAML per l'elaborazione di raccolte, ad esempio IList.The collection's element tag can be omitted, based on the XAML rules for processing collections such as IList. (In questo caso UIElementCollection effettivamente non è possibile creare un'istanza in quanto non espone un costruttore predefinito e per tale motivo il UIElementCollection elemento oggetto viene mostrato come commento).(In this case, UIElementCollection actually cannot be instantiated because it does not expose a default constructor, and that is why the UIElementCollection object element is shown commented out).

<StackPanel>  
  <StackPanel.Children>  
    <!--<UIElementCollection>-->  
    <Button>First Button</Button>  
    <Button>Second Button</Button>  
    <!--</UIElementCollection>-->  
  </StackPanel.Children>  
</StackPanel>  

Sintassi degli attributi (eventi)Attribute syntax (events)

È possibile usare la sintassi per attributi anche per membri che sono eventi anziché proprietà.Attribute syntax can also be used for members that are events rather than properties. In questo caso il nome dell'attributo corrisponde al nome dell'evento.In this case, the attribute's name is the name of the event. Nell'implementazione WPF di eventi per XAML il valore dell'attributo corrisponde al nome di un gestore che implementa il delegato dell'evento.In the WPF implementation of events for XAML, the attribute's value is the name of a handler that implements that event's delegate. Ad esempio, il markup seguente assegna un gestore per il Click evento da un Button creato nel markup:For example, the following markup assigns a handler for the Click event to a Button created in markup:

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="ExampleNamespace.ExamplePage">
  <Button Click="Button_Click" >Click Me!</Button>
</Page>

La correlazione tra eventi e XAML in WPF è molto più complessa di questo semplice esempio di sintassi per attributi.There is more to events and XAML in WPF than just this example of the attribute syntax. Ci si potrebbe chiedere ad esempio, cosa rappresenti ClickHandler a cui viene fatto riferimento e come questo venga definito.For example, you might wonder what the ClickHandler referenced here represents and how it is defined. La sezione Eventi e code-behind XAML più avanti in questo argomento illustra questi aspetti.This will be explained in the upcoming Events and XAML Code-Behind section of this topic.

Case e spazi vuoti in XAMLCase and white space in XAML

In genere XAML fa distinzione tra maiuscole e minuscole.XAML is generally speaking case sensitive. Per la risoluzione di tipi di supporto, XAML WPF fa distinzione tra maiuscole e minuscole in base alle stesse regole applicate da CLR relativamente a tale distinzione.For purposes of resolving backing types, WPF XAML is case sensitive by the same rules that the CLR is case sensitive. Gli elementi oggetto, gli elementi proprietà e i nomi di attributo devono essere sempre specificati usando correttamente le maiuscole e le minuscole quando si esegue il confronto del nome con il nome del tipo sottostante nell'assembly o con il nome di un membro di un tipo.Object elements, property elements, and attribute names must all be specified by using the sensitive casing when compared by name to the underlying type in the assembly, or to a member of a type. La distinzione tra maiuscole e minuscole vale anche per le parole chiave e le primitive del linguaggio XAML.XAML language keywords and primitives are also case sensitive. Per i valori la distinzione tra maiuscole e minuscole non si applica sempre.Values are not always case sensitive. Tale distinzione per i valori dipende dal comportamento del convertitore dei tipi associato alla proprietà che accetta il valore o al tipo di valore della proprietà.Case sensitivity for values will depend on the type converter behavior associated with the property that takes the value, or the property value type. Ad esempio, le proprietà che accettano il Boolean tipo può assumere uno true oppure True come valori equivalenti, ma solo perché il parser XAML WPF native tipo di conversione per la stringa da Boolean consente già tali valori come equivalenti.For example, properties that take the Boolean type can take either true or True as equivalent values, but only because the native WPF XAML parser type conversion for string to Boolean already permits these as equivalents.

Processori XAML WPF e i serializzatori verranno ignorare oppure eliminare tutto normalizzeranno gli spazi vuoti e verrà Normalizza tutti gli spazi vuoti significativi.WPF XAML processors and serializers will ignore or drop all nonsignificant white space, and will normalize any significant white space. Ciò è coerenza con i suggerimenti di comportamento degli spazi vuoti predefiniti della specifica XAML.This is consistent with the default white-space behavior recommendations of the XAML specification. Questo comportamento è generalmente significativo solo quando si specificano stringhe all'interno di proprietà di contenuto XAML.This behavior is generally only of consequence when you specify strings within XAML content properties. In termini più semplici, in XAML i caratteri di spazio, avanzamento riga e tabulazione vengono convertiti in spazi e viene conservato solo l'eventuale spazio rilevato a una delle estremità di una stringa contigua.In simplest terms, XAML converts space, linefeed and tab characters into spaces, and then preserves one space if found at either end of a contiguous string. La spiegazione completa della gestione degli spazi vuoti XAML non è trattata in questo argomento.The full explanation of XAML white-space handling is not covered in this topic. Per informazioni dettagliate, vedere elaborazione di XAML degli spazi vuoti.For details, see White space processing in XAML.

Estensioni di markupMarkup extensions

Le estensioni di markup sono un concetto del linguaggio XAML.Markup extensions are a XAML language concept. Se usate per specificare il valore di una sintassi per attributi, le parentesi graffe ({ e }) indicano l'uso di un'estensione di markup.When used to provide the value of an attribute syntax, curly braces ({ and }) indicate a markup extension usage. Questo uso indica all'elaborazione XAML che, diversamente dal solito, i valori degli attributi non devono essere considerati valori di stringa letterale o valori convertibili in stringa.This usage directs the XAML processing to escape from the general treatment of attribute values as either a literal string or a string-convertible value.

Le estensioni di markup maggiormente usate nella programmazione di applicazioni WPFWPF sono Binding, usata per le espressioni di associazione dati e i riferimenti alle risorse StaticResource e DynamicResource.The most common markup extensions used in WPFWPF application programming are Binding, used for data binding expressions, and the resource references StaticResource and DynamicResource. Le estensioni di markup consentono di usare la sintassi per attributi per specificare valori per le proprietà anche quando queste non supportano in generale una sintassi per attributi.By using markup extensions, you can use attribute syntax to provide values for properties even if that property does not support an attribute syntax in general. Spesso le estensioni di markup vengono usate con tipi di espressione intermedi per abilitare funzionalità quali il posticipo di valori o il riferimento ad altri oggetti presenti solo in fase di esecuzione.Markup extensions often use intermediate expression types to enable features such as deferring values or referencing other objects that are only present at run time.

Ad esempio, il markup seguente imposta il valore della Style proprietà usando la sintassi degli attributi.For example, the following markup sets the value of the Style property using attribute syntax. Il Style proprietà accetta un'istanza di Style (classe), che per impostazione predefinita non è stato possibile creare un'istanza da una stringa di sintassi di attributo.The Style property takes an instance of the Style class, which by default could not be instantiated by an attribute syntax string. Tuttavia, in questo caso l'attributo fa riferimento a una particolare estensione di markup, StaticResource.But in this case, the attribute references a particular markup extension, StaticResource. Quando quell'estensione di markup viene elaborata, restituisce un riferimento a uno stile del quale in precedenza è stata creata un'istanza come risorsa con chiave in un dizionario di risorse.When that markup extension is processed, it returns a reference to a style that was previously instantiated as a keyed resource in a resource dictionary.

<Page.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="Background" Value="Blue"/>
  </Style>
</Page.Resources>
<StackPanel>
  <Border Style="{StaticResource PageBackground}">
  </Border>
</StackPanel>

Per un elenco di riferimento di tutte le estensioni di markup per il linguaggio XAML implementato in modo specifico in WPF, vedere Estensioni XAML WPF.For a reference listing of all markup extensions for XAML implemented specifically in WPF, see WPF XAML Extensions. Per un elenco di riferimento delle estensioni di markup definite da System.Xaml e più ampiamente disponibili per implementazioni XAML .NET Framework, vedere Funzionalità del linguaggio dello spazio dei nomi XAML (x:).For a reference listing of the markup extensions that are defined by System.Xaml and are more widely available for .NET Framework XAML implementations, see XAML Namespace (x:) Language Features. Per altre informazioni sulle estensioni di markup, vedere Estensioni di markup e WPF XAML.For more information about markup extension concepts, see Markup Extensions and WPF XAML.

Convertitori di tipiType converters

La sezione Cenni sulla sintassi XAML afferma che il valore dell'attributo deve poter essere impostato tramite una stringa.In the XAML Syntax in Brief section, it was stated that the attribute value must be able to be set by a string. La gestione nativa di base di conversione delle stringhe in altri tipi di oggetti o valori primitivi si basa sul String tipo stesso, anche su un'elaborazione nativa per determinati tipi, ad esempio DateTime o Uri.The basic, native handling of how strings are converted into other object types or primitive values is based on the String type itself, in addition to native processing for certain types such as DateTime or Uri. Molti tipi WPFWPF o membri di tali tipi, tuttavia, estendono il comportamento di elaborazione degli attributi stringa di base in modo che le istanze di tipi di oggetto più complessi possano essere specificate come stringhe e attributi.But many WPFWPF types or members of those types extend the basic string attribute processing behavior, in such a way that instances of more complex object types can be specified as strings and attributes.

Il Thickness struttura è riportato un esempio di un tipo che dispone di una conversione di tipi abilitata per gli utilizzi XAML.The Thickness structure is an example of a type that has a type conversion enabled for XAML usages. Thickness indica misure all'interno di un rettangolo nidificato e viene utilizzato come valore per proprietà, ad esempio Margin.Thickness indicates measurements within a nested rectangle and is used as the value for properties such as Margin. Inserendo un convertitore di tipi nel Thickness, tutte le proprietà che utilizzano un Thickness sono più facili da specificare in XAML, in quanto possono essere specificate come attributi.By placing a type converter on Thickness, all properties that use a Thickness are easier to specify in XAML because they can be specified as attributes. L'esempio seguente usa una sintassi di conversione e attributo di tipo per fornire un valore per un Margin:The following example uses a type conversion and attribute syntax to provide a value for a Margin:

<Button Margin="10,20,10,30" Content="Click me"/>

L'esempio di sintassi per attributi precedente equivale al seguente esempio di sintassi più dettagliata, in cui il Margin viene impostato invece tramite la proprietà elemento che contiene la sintassi un Thickness elemento oggetto.The previous attribute syntax example is equivalent to the following more verbose syntax example, where the Margin is instead set through property element syntax containing a Thickness object element. Le quattro proprietà di chiave Thickness sono impostate come attributi nella nuova istanza di:The four key properties of Thickness are set as attributes on the new instance:

<Button Content="Click me">
  <Button.Margin>
    <Thickness Left="10" Top="20" Right="10" Bottom="30"/>
  </Button.Margin>
</Button>

Nota

Esiste inoltre un numero limitato di oggetti in cui la conversione dei tipi rappresenta l'unico modo pubblico per impostare una proprietà su quel tipo senza coinvolgere una sottoclasse, poiché il tipo stesso non dispone di un costruttore predefinito.There are also a limited number of objects where the type conversion is the only public way to set a property to that type without involving a subclass, because the type itself does not have a default constructor. Un esempio è Cursor.An example is Cursor.

Per altre informazioni sul supporto della conversione dei tipi e del relativo uso per la sintassi per attributi, vedere TypeConverter e XAML.For more information on how type conversion and its use for attribute syntax is supported, see TypeConverters and XAML.

Elementi radice XAML e spazi dei nomi XAMLXAML root elements and XAML namespaces

Per essere sia un file XMLXML ben formato sia un file XAML valido, un file XAML deve includere solo un elemento radice.A XAML file must have only one root element, in order to be both a well-formed XMLXML file and a valid XAML file. Per scenari WPF tipici, si usa un elemento radice che ha un significato prominente nel modello applicazione WPF (ad esempio, Window oppure Page per una pagina ResourceDictionary per un dizionario esterno, o Application per la definizione dell'applicazione).For typical WPF scenarios, you use a root element that has a prominent meaning in the WPF application model (for example, Window or Page for a page, ResourceDictionary for an external dictionary, or Application for the application definition). L'esempio seguente illustra l'elemento radice di un tipico file XAML per un WPFWPF pagina, con l'elemento radice di Page.The following example shows the root element of a typical XAML file for a WPFWPF page, with the root element of Page.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Page>

L'elemento radice inoltre contiene gli attributi xmlns e xmlns:x,The root element also contains the attributes xmlns and xmlns:x. che indicano a un processore XAML gli spazi dei nomi XAML contenenti le definizioni dei tipi per i tipi di supporto a cui il markup farà riferimento come elementi.These attributes indicate to a XAML processor which XAML namespaces contain the type definitions for backing types that the markup will reference as elements. L'attributo xmlns indica in modo specifico lo spazio dei nomi XAML predefinito.The xmlns attribute specifically indicates the default XAML namespace. All'interno dello spazio dei nomi XAML predefinito gli elementi oggetto nel markup possono essere specificati senza prefisso.Within the default XAML namespace, object elements in the markup can be specified without a prefix. Per la maggior parte degli scenari con applicazioni WPFWPF e per quasi tutti gli esempi offerti nelle sezioni di WPFWPF nell'SDKSDK, lo spazio dei nomi XAML predefinito viene mappato allo spazio dei nomi WPFWPF http://schemas.microsoft.com/winfx/2006/xaml/presentationhttp://schemas.microsoft.com/winfx/2006/xaml/presentation.For most WPFWPF application scenarios, and for almost all of the examples given in the WPFWPF sections of the SDKSDK, the default XAML namespace is mapped to the WPFWPF namespace http://schemas.microsoft.com/winfx/2006/xaml/presentationhttp://schemas.microsoft.com/winfx/2006/xaml/presentation. L'attributo xmlns:x indica uno spazio dei nomi XAML aggiuntivo, che viene mappato allo spazio dei nomi del linguaggio XAML http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml.The xmlns:x attribute indicates an additional XAML namespace, which maps the XAML language namespace http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml.

Tale uso di xmlns per definire un ambito per l'uso e il mapping di un NameScope è coerente con la specifica XML 1.0.This usage of xmlns to define a scope for usage and mapping of a namescope is consistent with the XML 1.0 specification. I NameScope XAML sono diversi dai NameScope XML solo in quanto nei primi vengono indicati anche alcuni aspetti correlati al supporto degli elementi del NameScope da parte dei tipi riguardo a risoluzione dei tipi e analisi di XAML.XAML namescopes are different from XML namescopes only in that a XAML namescope also implies something about how the namescope's elements are backed by types when it comes to type resolution and parsing the XAML.

Si noti che gli attributi xmlns sono strettamente necessari solo per l'elemento radice di ogni file XAML.Note that the xmlns attributes are only strictly necessary on the root element of each XAML file. Le definizioni xmlns si applicheranno a tutti gli elementi discendenti dell'elemento radice, un comportamento coerente con la specifica XML 1.0 per xmlns. Gli attributi xmlns sono inoltre consentiti in altri elementi sottostanti la radice e si applicherebbero a qualsiasi elemento discendente dell'elemento di definizione.xmlns definitions will apply to all descendant elements of the root element (this behavior is again consistent with the XML 1.0 specification for xmlns.) xmlns attributes are also permitted on other elements underneath the root, and would apply to any descendant elements of the defining element. Tuttavia, la definizione o ridefinizione frequente degli spazi dei nomi XAML può risultare in uno stile di markup XAML di difficile lettura.However, frequent definition or redefinition of XAML namespaces can result in a XAML markup style that is difficult to read.

L'implementazione WPFWPF del relativo processore XAML include un'infrastruttura che rileva gli assembly principali WPF.The WPFWPF implementation of its XAML processor includes an infrastructure that has awareness of the WPF core assemblies. Gli assembly principali WPFWPF contengono notoriamente i tipi che supportano i mapping WPFWPF allo spazio dei nomi XAML predefinito.The WPFWPF core assemblies are known to contain the types that support the WPFWPF mappings to the default XAML namespace. Ciò è consentito tramite la configurazione inclusa nel file di compilazione del progetto e nei sistemi di compilazione e del progetto WPF.This is enabled through configuration that is part of your project build file and the WPF build and project systems. La dichiarazione dello spazio dei nomi XAML predefinito come xmlns predefinito è pertanto l'unica operazione necessaria per fare riferimento a elementi XAML provenienti da assembly WPFWPF.Therefore, declaring the default XAML namespace as the default xmlns is all that is necessary in order to reference XAML elements that come from WPFWPF assemblies.

Il prefisso x:The x: prefix

L'esempio di elemento radice precedente usa il prefisso x: per eseguire il mapping dello spazio dei nomi XAML http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml, che è lo spazio dei nomi XAML dedicato che supporta costrutti di linguaggio XAML.In the previous root element example, the prefix x: was used to map the XAML namespace http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml, which is the dedicated XAML namespace that supports XAML language constructs. Il prefisso x: viene usato per il mapping di questo spazio dei nomi XAML nei modelli per i progetti, negli esempi e nella documentazione in tutto l'SDKSDK.This x: prefix is used for mapping this XAML namespace in the templates for projects, in examples, and in documentation throughout this SDKSDK. Lo spazio dei nomi XAML per il linguaggio XAML contiene diversi costrutti di programmazione che verranno usati molto frequentemente in XAML.The XAML namespace for the XAML language contain several programming constructs that you will use very frequently in your XAML. Di seguito viene presentato un elenco dei più comuni costrutti di programmazione del prefisso x: che verranno usati:The following is a listing of the most common x: prefix programming constructs you will use:

  • X:Key: imposta una chiave univoca per ogni risorsa in un ResourceDictionary (o i concetti di dizionario simili in altri framework).x:Key: Sets a unique key for each resource in a ResourceDictionary (or similar dictionary concepts in other frameworks). x:Key sarà coinvolto probabilmente nel 90% degli usi di x: osservati nel markup di un'applicazione WPF tipica.x:Key will probably account for 90% of the x: usages you will see in a typical WPF application's markup.

  • x:Class: specifica lo spazio dei nomi CLRCLR e il nome della classe che offre il code-behind per una pagina XAML.x:Class: Specifies the CLRCLR namespace and class name for the class that provides code-behind for a XAML page. È necessario che tale classe supporti il code-behind per ciascun modello di programmazione WPF ed è per questa ragione che quasi sempre viene eseguito il mapping di x:, anche se non sono presenti risorse.You must have such a class to support code-behind per the WPF programming model, and therefore you almost always see x: mapped, even if there are no resources.

  • x:Name: specifica il nome di un oggetto di runtime per l'istanza presente nel codice della fase di esecuzione dopo l'elaborazione di un elemento oggetto.x:Name: Specifies a run-time object name for the instance that exists in run-time code after an object element is processed. In generale, si usa spesso una proprietà equivalente definita in WPF per x:Name.In general, you will frequently use a WPF-defined equivalent property for x:Name. Tali proprietà eseguono specificamente il mapping a una proprietà di supporto CLR e risultano pertanto più utili per la programmazione di applicazioni, in cui spesso viene uso codice della fase di esecuzione per individuare gli elementi denominati dal linguaggio XAML inizializzato.Such properties map specifically to a CLR backing property and are thus more convenient for application programming, where you frequently use run time code to find the named elements from initialized XAML. Tali proprietà più comuni è FrameworkElement.Name.The most common such property is FrameworkElement.Name. È comunque possibile usare X:Name quando l'equivalente a livello di framework WPF Name proprietà non è supportata in un determinato tipo.You might still use x:Name when the equivalent WPF framework-level Name property is not supported in a particular type. Tale situazione si verifica in determinati scenari di animazione.This occurs in certain animation scenarios.

  • x:Static: abilita il riferimento che restituisce un valore statico che non costituisce in altro modo una proprietà compatibile con XAML.x:Static: Enables a reference that returns a static value that is not otherwise a XAML-compatible property.

  • X:Type: crea un Type riferimento basato su un nome di tipo.x:Type: Constructs a Type reference based on a type name. Viene utilizzato per specificare gli attributi che accettano Type, ad esempio Style.TargetType, sebbene spesso la proprietà disponga di stringa nativi-a-Type conversione in modo che il X:Type uso dell'estensione di markup facoltativo.This is used to specify attributes that take Type, such as Style.TargetType, although frequently the property has native string-to-Type conversion in such a way that the x:Type markup extension usage is optional.

Nel prefisso x: o nello spazio dei nomi XAML sono presenti altri costrutti di programmazione non altrettanto comuni.There are additional programming constructs in the x: prefix/XAML namespace, which are not as common. Per informazioni dettagliate, vedere Funzionalità del linguaggio dello spazio dei nomi XAML (x:).For details, see XAML Namespace (x:) Language Features.

Prefissi personalizzati e i tipi personalizzati in XAMLCustom prefixes and custom types in XAML

Per gli assembly personalizzati o per gli assembly esterni agli elementi principali WPF di PresentationCore, PresentationFramework e WindowsBase, è possibile specificare l'assembly come parte di un mapping xmlns personalizzato.For your own custom assemblies, or for assemblies outside the WPF core of PresentationCore, PresentationFramework and WindowsBase, you can specify the assembly as part of a custom xmlns mapping. È quindi possibile fare riferimento ai tipi dell'assembly in XAML, purché tale tipo sia stato implementato correttamente per supportare gli usi di XAML desiderati.You can then reference types from that assembly in your XAML, so long as that type is correctly implemented to support the XAML usages you are attempting.

Di seguito viene riportato un esempio molto semplice del funzionamento dei prefissi personalizzati nel markup XAML.The following is a very basic example of how custom prefixes work in XAML markup. Il prefisso custom è definito nel tag dell'elemento radice e viene mappato a un assembly specifico compresso e disponibile con l'applicazione.The prefix custom is defined in the root element tag, and mapped to a specific assembly that is packaged and available with the application. Questo assembly contiene un tipo NumericUpDown, implementato per supportare l'uso generale di XAML, nonché l'uso di un'ereditarietà delle classi che ne consenta l'inserimento in questo punto specifico in un modello di contenuto XAML WPF.This assembly contains a type NumericUpDown, which is implemented to support general XAML usage as well as using a class inheritance that permits its insertion at this particular point in a WPF XAML content model. Un'istanza di questo controllo NumericUpDown viene dichiarata come elemento oggetto, usando il prefisso in modo tale che un parser XAML sia in grado di riconoscere lo spazio dei nomi XAML contenente il tipo e pertanto la posizione dell'assembly di supporto che contiene la definizione del tipo.An instance of this NumericUpDown control is declared as an object element, using the prefix so that a XAML parser knows which XAML namespace contains the type, and therefore where the backing assembly is that contains the type definition.

<Page  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
    xmlns:custom="clr-namespace:NumericUpDownCustomControl;assembly=CustomLibrary"  
    >  
  <StackPanel Name="LayoutRoot">  
    <custom:NumericUpDown Name="numericCtrl1" Width="100" Height="60"/>  
...  
  </StackPanel>  
</Page>  

Per altre informazioni sui tipi personalizzati in XAML, vedere XAML e classi personalizzate per WPF.For more information about custom types in XAML, see XAML and Custom Classes for WPF.

Per altre informazioni sulla modalità di correlazione tra gli spazi dei nomi XML e gli spazi dei nomi del codice di supporto negli assembly, vedere Spazi dei nomi XAML e mapping dello spazio dei nomi per XAML WPF.For more information about how XML namespaces and the namespaces of the backing code in assemblies are related, see XAML Namespaces and Namespace Mapping for WPF XAML.

Eventi e code-behind XAMLEvents and XAML code-behind

La maggior parte delle applicazioni WPFWPF include sia markup che code-behind XAML.Most WPFWPF applications consist of both XAML markup and code-behind. All'interno di un progetto, il XAML viene scritto come un .xaml file e un CLRCLR linguaggio, ad esempio Microsoft Visual Basic o c# viene utilizzato per scrivere un file code-behind.Within a project, the XAML is written as a .xaml file, and a CLRCLR language such as Microsoft Visual Basic or C# is used to write a code-behind file. Durante la compilazione dal markup di un file XAML come parte dei modelli di applicazione e di programmazione WPF, il percorso del file code-behind XAML per un file XAML viene identificato specificando uno spazio dei nomi e una classe come attributo x:Class dell'elemento radice della pagina XAML.When a XAML file is markup compiled as part of the WPF programming and application models, the location of the XAML code-behind file for a XAML file is identified by specifying a namespace and class as the x:Class attribute of the root element of the XAML.

Gli esempi riportati fino a questo momento illustrano molti pulsanti, nessuno dei quali era associato a un comportamento logico.In the examples so far, you have seen several buttons, but none of these buttons had any logical behavior associated with them yet. Il meccanismo primario a livello di applicazione per l'aggiunta di un comportamento per un elemento oggetto consiste nell'uso di un evento esistente della classe dell'elemento e nella scrittura di un gestore specifico per quell'evento che viene richiamato nel momento in cui l'evento viene generato in fase di esecuzione.The primary application-level mechanism for adding a behavior for an object element is to use an existing event of the element class, and to write a specific handler for that event that is invoked when that event is raised at run time. Il nome dell'evento e il nome del gestore da usare sono specificati nel markup, mentre il codice che implementa il gestore è definito nel code-behind.The event name and the name of the handler to use are specified in the markup, whereas the code that implements your handler is defined in the code-behind.

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="ExampleNamespace.ExamplePage">
  <Button Click="Button_Click" >Click Me!</Button>
</Page>
namespace ExampleNamespace
{
  public partial class ExamplePage
  {
    void Button_Click(object sender, RoutedEventArgs e)
    {
      Button b = e.Source as Button;
      b.Foreground = Brushes.Red;
    }
  }
}
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    Dim b As Button = e.Source
    b.Foreground = Brushes.Red
End Sub

Si noti che il file code-behind usa lo spazio dei nomi CLR ExampleNamespace e dichiara ExamplePage come classe parziale all'interno di tale spazio dei nomi.Notice that the code-behind file uses the CLR namespace ExampleNamespace and declares ExamplePage as a partial class within that namespace. Questo è parallelo al valore dell'attributo x:Class di ExampleNamespace``ExamplePageThis parallels the x:Class attribute value of ExampleNamespace.ExamplePage offerto nella radice del markup.that was provided in the markup root. Il compilatore del markup WPF creerà una classe parziale per ogni file XAML compilato derivando una classe dal tipo di elemento radice.The WPF markup compiler will create a partial class for any compiled XAML file, by deriving a class from the root element type. Quando si offre code-behind che definisce anche la stessa classe parziale, il codice risultante viene combinato all'interno dello stesso spazio dei nomi e della stessa classe dell'applicazione compilata.When you provide code-behind that also defines the same partial class, the resulting code is combined within the same namespace and class of the compiled application.

Per altre informazioni sui requisiti per la programmazione di code-behind in WPF, vedere la sezione di Code-behind e XAML in WPF Code-behind, gestore eventi e requisiti della classe parziale in WPF.For more information about requirements for code-behind programming in WPF, see the "Code-behind, Event Handler, and Partial Class Requirements" section of Code-Behind and XAML in WPF.

Se non si desidera creare un file code-behind distinto, è anche possibile incorporare il codice in un file XAML.If you do not want to create a separate code-behind file, you can also inline your code in a XAML file. Tuttavia, il codice inline è una tecnica meno versatile che presenta limitazioni sostanziali.However, inline code is a less versatile technique that has substantial limitations. Per informazioni dettagliate, vedere Code-behind e XAML in WPF.For details, see Code-Behind and XAML in WPF.

Eventi indirizzatiRouted events

Un evento indirizzato è una particolare funzionalità evento fondamentale per WPFWPF.A particular event feature that is fundamental to WPFWPF is a routed event. Gli eventi indirizzati consentono a un elemento di gestire un evento generato da un elemento diverso, purché gli elementi siano connessi tramite una relazione di struttura ad albero.Routed events enable an element to handle an event that was raised by a different element, as long as the elements are connected through a tree relationship. Quando si specifica la gestione dell'evento con un attributo XAML, l'evento indirizzato può essere ascoltato e gestito in qualsiasi elemento, inclusi quelli che non elencano l'evento specifico nella tabella dei membri della classe.When specifying event handling with a XAML attribute, the routed event can be listened for and handled on any element, including elements that do not list that particular event in the class members table. Ciò è possibile qualificando l'attributo del nome evento con il nome della classe di appartenenza.This is accomplished by qualifying the event name attribute with the owning class name. Ad esempio, l'elemento padre StackPanel nel StackPanel / Button esempio è stato possibile registrare un gestore per il pulsante dell'elemento figlio Click eventi specificando l'attributo Button.Click nel StackPanel elemento oggetto, con il nome del gestore come valore dell'attributo.For instance, the parent StackPanel in the ongoing StackPanel / Button example could register a handler for the child element button's Click event by specifying the attribute Button.Click on the StackPanel object element, with your handler name as the attribute value. Per altre informazioni sul funzionamento degli eventi indirizzati, vedere Cenni preliminari sugli eventi indirizzati.For more information about how routed events work, see Routed Events Overview.

Elementi denominati XAMLXAML named elements

Per impostazione predefinita, l'istanza di oggetto creata in un oggetto grafico tramite l'elaborazione di un elemento oggetto XAML non possiede un identificatore univoco o un riferimento a un oggetto.By default, the object instance that is created in an object graph by processing a XAML object element does not possess a unique identifier or object reference. Al contrario, se si chiama un costruttore nel codice, quasi sempre il risultato del costruttore viene usato per impostare una variabile sull'istanza creata, in modo che sia possibile fare riferimento all'istanza nel codice in un secondo momento.In contrast, if you call a constructor in code, you almost always use the constructor result to set a variable to the constructed instance, so that you can reference the instance later in your code. Per offrire accesso standard agli oggetti creati tramite una definizione del markup, in XAML viene definito l'attributo x:Name.In order to provide standardized access to objects that were created through a markup definition, XAML defines the x:Name attribute. È possibile impostare il valore dell'attributo x:Name in qualsiasi elemento oggetto.You can set the value of the x:Name attribute on any object element. All'interno del code-behind l'identificatore scelto è equivalente a una variabile dell'istanza che fa riferimento all'istanza costruita.In your code-behind, the identifier you choose is equivalent to an instance variable that refers to the constructed instance. Gli elementi denominati funzionano sotto ogni aspetto come istanze dell'oggetto (il nome fa riferimento a tale istanza) e il code-behind può fare riferimento agli elementi denominati per gestire le interazioni di runtime all'interno dell'applicazione.In all respects, named elements function as if they were object instances (the name references that instance), and your code-behind can reference the named elements to handle run-time interactions within the application. Questa connessione tra istanze e le variabili viene effettuata tramite il compilatore di markup XAML WPF e più specificatamente coinvolge funzionalità e i modelli, ad esempio InitializeComponent non che verrà descritta in dettaglio in questo argomento.This connection between instances and variables is accomplished by the WPF XAML markup compiler, and more specifically involve features and patterns such as InitializeComponent that will not be discussed in detail in this topic.

Gli elementi XAML a livello di framework WPF ereditano una Name proprietà, che equivale al XAML definito x:Name attributo.WPF framework-level XAML elements inherit a Name property, which is equivalent to the XAML defined x:Name attribute. Altre classi offrono equivalenti a livello di proprietà per x:Name, che in genere viene definito anche come proprietà Name.Certain other classes also provide property-level equivalents for x:Name, which is also generally defined as a Name property. In generale se non è possibile individuare una proprietà Name nella tabella dei membri dell'elemento o del tipo scelto, usare x:Name in alternativa.Generally speaking, if you cannot find a Name property in the members table for your chosen element/type, use x:Name instead. Il x:Name valori fornirà un identificatore a un elemento XAML che può essere utilizzato in fase di esecuzione dai sottosistemi specifici o dai metodi di utilità, ad esempio FindName.The x:Name values will provide an identifier to a XAML element that can be used at run time, either by specific subsystems or by utility methods such as FindName.

L'esempio seguente imposta Name su un StackPanel elemento.The following example sets Name on a StackPanel element. Quindi un gestore di un Button all'interno di esso StackPanel riferimenti il StackPanel tramite il riferimento all'istanza buttonContainer come impostato da Name.Then, a handler on a Button within that StackPanel references the StackPanel through its instance reference buttonContainer as set by Name.

<StackPanel Name="buttonContainer">
  <Button Click="RemoveThis">Click to remove this button</Button>
</StackPanel>
void RemoveThis(object sender, RoutedEventArgs e)
{
    FrameworkElement fe = e.Source as FrameworkElement;
    if (buttonContainer.Children.Contains(fe))
    {
        buttonContainer.Children.Remove(fe);
    }
}
 Private Sub RemoveThis(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
     Dim fe As FrameworkElement = e.Source
     If (buttonContainer.Children.Contains(fe)) Then
         buttonContainer.Children.Remove(fe)
     End If
End Sub

Come accade per una variabile, il nome XAML di un'istanza è governato da un concetto di ambito, per cui è possibile attivare nomi che siano univoci all'interno di un determinato ambito prevedibile.Just like a variable, the XAML name for an instance is governed by a concept of scope, so that names can be enforced to be unique within a certain scope that is predictable. Il markup primario che definisce una pagina denota un NameScope XAML univoco, il cui limite è costituito dall'elemento radice della pagina.The primary markup that defines a page denotes one unique XAML namescope, with the XAML namescope boundary being the root element of that page. Altre origini di markup, tuttavia, possono interagire con una pagina in fase di esecuzione, ad esempio gli stili o i modelli all'interno degli stili, e tali origini di markup spesso dispongono di NameScope XAML propri non necessariamente connessi al NameScope XAML della pagina.However, other markup sources can interact with a page at run time, such as styles or templates within styles, and such markup sources often have their own XAML namescopes that do not necessarily connect with the XAML namescope of the page. Per ulteriori informazioni sul x:Name e gli ambiti dei nomi XAML, vedere Name, direttiva X:Name, o NameScope XAML WPF.For more information on x:Name and XAML namescopes, see Name, x:Name Directive, or WPF XAML Namescopes.

Le proprietà associate ed eventi associatiAttached properties and attached events

XAML specifica una funzionalità del linguaggio che consente di definire determinati eventi o proprietà in qualsiasi elemento, indipendentemente dalla presenza della proprietà o dell'evento all'interno delle definizioni del tipo per l'elemento per cui è impostato l'evento o la proprietà.XAML specifies a language feature that enables certain properties or events to be specified on any element, regardless of whether the property or event exists in the type's definitions for the element it is being set on. La versione delle proprietà di questa funzionalità è denominata proprietà associata, la versione degli eventi è denominata evento associato.The properties version of this feature is called an attached property, the events version is called an attached event. Concettualmente, è possibile pensare alle proprietà associate e agli eventi associati come a membri globali che possono essere impostati in qualsiasi elemento o istanza di oggetto XAML.Conceptually, you can think of attached properties and attached events as global members that can be set on any XAML element/object instance. Tuttavia, tale elemento, classe o infrastruttura più ampia dovrà supportare un archivio delle proprietà di supporto per i valori associati.However, that element/class or a larger infrastructure must support a backing property store for the attached values.

Le proprietà associate in XAML vengono in genere usate tramite la sintassi per attributi.Attached properties in XAML are typically used through attribute syntax. Per specificare una proprietà associata in questa sintassi, è necessario usare il formato tipoProprietario.nomeProprietà.In attribute syntax, you specify an attached property in the form ownerType.propertyName.

In apparenza, assomiglia all'uso di un elemento proprietà, tuttavia in questo caso tipoProprietario che si specifica è sempre un tipo diverso rispetto all'elemento oggetto nel quale è impostata la proprietà associata.Superficially, this resembles a property element usage, but in this case the ownerType you specify is always a different type than the object element where the attached property is being set. tipoProprietario è il tipo che offre i metodi della funzione di accesso richiesti da un processore XAML per ottenere o impostare il valore della proprietà associata.ownerType is the type that provides the accessor methods that are required by a XAML processor in order to get or set the attached property value.

Lo scenario più comune per le proprietà associate consiste nel consentire agli elementi figlio di segnalare un valore di proprietà al relativo elemento padre.The most common scenario for attached properties is to enable child elements to report a property value to their parent element.

Nell'esempio seguente viene illustrato il DockPanel.Dock proprietà associata.The following example illustrates the DockPanel.Dock attached property. Il DockPanel classe definisce le funzioni di accesso per DockPanel.Dock e pertanto possiede la proprietà associata.The DockPanel class defines the accessors for DockPanel.Dock and therefore owns the attached property. Il DockPanel classe include anche una logica che scorre i relativi elementi figlio e in particolare controlla ogni elemento di un valore impostato di DockPanel.Dock.The DockPanel class also includes logic that iterates its child elements and specifically checks each element for a set value of DockPanel.Dock. Se individuato, quel valore viene usato durante il layout per posizionare gli elementi figlio.If a value is found, that value is used during layout to position the child elements. Usare la DockPanel.Dock questa funzionalità di posizionamento e proprietà associata è di fatto infatti lo scenario per il DockPanel classe.Use of the DockPanel.Dock attached property and this positioning capability is in fact the motivating scenario for the DockPanel class.

<DockPanel>
  <Button DockPanel.Dock="Left" Width="100" Height="20">I am on the left</Button>
  <Button DockPanel.Dock="Right" Width="100" Height="20">I am on the right</Button>
</DockPanel>

In WPFWPF la maggior parte o tutte le proprietà associate sono implementate anche come proprietà di dipendenza.In WPFWPF, most or all the attached properties are also implemented as dependency properties. Per informazioni dettagliate, vedere Cenni preliminari sulle proprietà associate.For details, see Attached Properties Overview.

Gli eventi associati usano un formato di sintassi per attributi tipoProprietario.nomeEvento simile.Attached events use a similar ownerType.eventName form of attribute syntax. Come per gli eventi non associati, il valore dell'attributo per un evento associato in XAML specifica il nome del metodo di gestione richiamato quando l'evento viene gestito nell'elemento.Just like the non-attached events, the attribute value for an attached event in XAML specifies the name of the handler method that is invoked when the event is handled on the element. Gli usi di eventi associati in XAML WPF sono meno comuni.Attached event usages in WPF XAML are less common. Per altre informazioni, vedere Cenni preliminari sugli eventi associati.For more information, see Attached Events Overview.

Tipi di base e XAMLBase types and XAML

Il markup XAML WPF sottostante e il relativo spazio dei nomi XAML sono una raccolta di tipi corrispondenti a oggetti CLRCLR, nonché a elementi di markup da usare in XAML.Underlying WPF XAML and its XAML namespace is a collection of types that correspond to CLRCLR objects in addition to markup elements for XAML. Tuttavia non è possibile eseguire il mapping di tutte le classi agli elementi.However, not all classes can be mapped to elements. Classi astratte, ad esempio ButtonBase, e alcune classi di base non astratte vengono usati per l'ereditarietà nel CLRCLR modello a oggetti.Abstract classes, such as ButtonBase, and certain nonabstract base classes are used for inheritance in the CLRCLR objects model. Le classi di base, incluse quelle astratte, continuano a essere importanti per lo sviluppo di XAML, in quanto ciascuno degli elementi XAML concreti eredita i membri da una classe di base nella relativa gerarchia.Base classes, including abstract ones, are still important to XAML development because each of the concrete XAML elements inherits members from some base class in its hierarchy. Spesso tali membri includono proprietà che possono essere impostate come attributi nell'elemento oppure eventi che possono essere gestiti.Often these members include properties that can be set as attributes on the element, or events that can be handled. FrameworkElement costituisce la base concreta Interfaccia utenteUI classe di WPFWPF a livello di framework WPF.FrameworkElement is the concrete base Interfaccia utenteUI class of WPFWPF at the WPF framework level. Quando si progettano Interfaccia utenteUI, si userà varie forme, pannello, decorator o classi di controlli, quali tutto derivano da FrameworkElement.When designing Interfaccia utenteUI, you will use various shape, panel, decorator, or control classes, which all derive from FrameworkElement. Una classe di base correlata FrameworkContentElement, supporta elementi orientati ai documenti che funzionano bene per una presentazione di layout di flusso, usando APIAPIs che eseguono il mirroring il APIAPIs in FrameworkElement.A related base class, FrameworkContentElement, supports document-oriented elements that work well for a flow layout presentation, using APIAPIs that deliberately mirror the APIAPIs in FrameworkElement. La combinazione di attributi a livello di elemento e di un modello a oggetti CLRCLR offre un set di proprietà comuni che è possibile impostare nella maggior parte degli elementi XAML concreti, indipendentemente dall'elemento XAML specifico e dal relativo tipo sottostante.The combination of attributes at the element level and a CLRCLR object model provides you with a set of common properties that are settable on most concrete XAML elements, regardless of the specific XAML element and its underlying type.

Sicurezza XAMLXAML security

XAML è un linguaggio di markup che rappresenta direttamente la creazione di istanze di oggetti e la relativa esecuzione.XAML is a markup language that directly represents object instantiation and execution. Gli elementi creati in XAML, pertanto, hanno la stessa capacità di interagire con risorse di sistema (quali accesso di rete e IO file system) del codice generato equivalente.Therefore, elements created in XAML have the same ability to interact with system resources (network access, file system IO, for example) as the equivalent generated code does.

WPFWPF supporta la Sicurezza per l'accesso al codice (CAS, Code Access Security)Code Access Security (CAS) del framework di sicurezza .NET Framework 4.NET Framework 4. supports the .NET Framework 4.NET Framework 4 security framework Sicurezza per l'accesso al codice (CAS, Code Access Security)Code Access Security (CAS). Di conseguenza, il contenuto WPFWPF in esecuzione nell'area Internet dispone di autorizzazioni di esecuzione ridotte.This means that WPFWPF content running in the internet zone has reduced execution permissions. In questa area Internet vengono in genere eseguiti il codice "XAML separato", ovvero pagine di XAML non compilato interpretato in fase di caricamento da parte di un visualizzatore XAML, e l'applicazione browser XAML (XBAP)XAML browser application (XBAP), che usano lo stesso set di autorizzazioni."Loose XAML" (pages of noncompiled XAML interpreted at load time by a XAML viewer) and applicazione browser XAML (XBAP)XAML browser application (XBAP) are usually run in this internet zone and use the same permission set. Il codice XAML caricato in un'applicazione completamente attendibile, tuttavia, dispone dello stesso accesso alle risorse di sistema dell'applicazione host.However, XAML loaded in to a fully trusted application has the same access to the system resources as the hosting application does. Per altre informazioni, vedere Sicurezza con attendibilità parziale in WPF.For more information, see WPF Partial Trust Security.

Caricamento XAML dal codiceLoading XAML from code

Sebbene sia possibile usare XAML per definire un'interfaccia utente completa, è talvolta opportuno definire solo una parte dell'interfaccia utente tramite XAML.XAML can be used to define all of the UI, but it is sometimes also appropriate to define just a piece of the UI in XAML. Questa funzionalità può risultare utile per consentire una personalizzazione parziale, l'archiviazione locale di informazioni, l'uso di XAML per offrire un oggetto business o per molti altri scenari possibili.This capability could be used to enable partial customization, local storage of information, using XAML to provide a business object, or a variety of possible scenarios. La chiave per questi scenari è il XamlReader classi e i relativi Load (metodo).The key to these scenarios is the XamlReader class and its Load method. L'input è un file XAML, mentre l'output è un oggetto che rappresenta l'intera struttura ad albero di oggetti di runtime creata dal markup.The input is a XAML file, and the output is an object that represents all of the run-time tree of objects that was created from that markup. È possibile quindi inserire l'oggetto in modo che sia una proprietà di un altro oggetto già esistente nell'applicazione.You then can insert the object to be a property of another object that already exists in the application. Se la proprietà è una proprietà appropriata nel modello di contenuto che dispone di funzionalità di visualizzazione e che notifica al motore di esecuzione che è stato aggiunto nuovo contenuto nell'applicazione, è possibile modificare in modo piuttosto semplice il contenuto di un'applicazione in esecuzione tramite il caricamento in XAML.So long as the property is an appropriate property in the content model that has eventual display capabilities and that will notify the execution engine that new content has been added into the application, you can modify a running application's contents very easily by loading in XAML. Si noti che questa funzionalità in genere è disponibile solo nelle applicazioni con attendibilità completa, a causa delle ovvie implicazioni di sicurezza del caricamento di file all'interno delle applicazioni in esecuzione.Note that this capability is generally only available in full-trust applications, because of the obvious security implications of loading files into applications as they run.

Argomenti successiviWhat's next

Questo argomento offre un'introduzione di base ai concetti e alla terminologia correlati alla sintassi XAML applicata a WPF.This topic provides a basic introduction to XAML syntax concepts and terminology as it applies to WPF. Per altre informazioni sui termini usati in questo argomento, vedere Descrizione dettagliata della sintassi XAML.For more information about the terms used here, see XAML Syntax In Detail.

Se non è già stato fatto, provare a eseguire gli esercizi nell'argomento dell'esercitazione procedura dettagliata: prima applicazione desktop WPF.If you have not already done this, try the exercises in the tutorial topic Walkthrough: My first WPF desktop application. Durante la creazione dell'applicazione basata sul markup descritta nell'esercitazione, l'esercizio consentirà di approfondire molti dei concetti trattati in questo argomento.When you create the markup-centric application described by the tutorial, the exercise will help reinforce many of the concepts described in this topic.

WPFWPF Usa un modello specifico dell'applicazione basata sul Application classe. uses a particular application model that is based on the Application class. Per informazioni dettagliate, vedere Cenni preliminari sulla gestione di applicazioni.For details, see Application Management Overview.

In Compilazione di un'applicazione WPF vengono offerti maggiori dettagli su come compilare applicazioni che includono XAML usando la riga di comando e Microsoft Visual StudioMicrosoft Visual Studio.Building a WPF Application gives you more details about how to build XAML inclusive applications from the command line and with Microsoft Visual StudioMicrosoft Visual Studio.

Cenni preliminari sulle proprietà di dipendenza offre altre informazioni sulla versatilità delle proprietà in WPFWPF introduce il concetto di proprietà di dipendenza.Dependency Properties Overview gives more information about the versatility of properties in WPFWPF, and introduces the concept of dependency properties.

Vedere ancheSee also

Descrizione dettagliata della sintassi XAMLXAML Syntax In Detail
Classi XAML e personalizzate per WPFXAML and Custom Classes for WPF
Funzionalità del linguaggio dello spazio dei nomi XAML (x:)XAML Namespace (x:) Language Features
Estensioni XAML WPFWPF XAML Extensions
Cenni preliminari sugli elementi di baseBase Elements Overview
Strutture ad albero in WPFTrees in WPF