web-dev-qa-db-fra.com

Exécuter vs contenu vs texte dans WPF

Dans un WPF (ou même une application Windows 8 ou 8.1), vous avez trois façons possibles d'ajouter un texte dans un contrôle.

  1. Élément Run à l'intérieur de l'élément TextBlock

    <TextBlock>
        <Run>My text</Run>
    </TextBlock>
    
  2. Propriété Text en tant qu'attribut de l'élément TextBlock

    <TextBlock Text="My text" />
    
  3. Propriété Text en tant qu'élément à l'intérieur de l'élément TextBlock

    <TextBlock>
        <TextBlock.Text>my text</TextBlock.Text>
    </TextBlock>`
    

Quelles sont les différences entre ces trois approches? Et pourquoi vous devez utiliser Text pour un TextBlock et Content pour un ComboboxItem?

18
H. Pauwelyn

Un contrôle avec une propriété Text ne peut accepter qu'une chaîne et est rendu d'une manière spécifique gérée par ce contrôle. Des exemples de tels contrôles sont TextBlock et TextBox .

Les contrôles avec une propriété Content peuvent avoir littéralement n'importe quel object défini sur cette propriété. Ces contrôles transmettent généralement la valeur à la propriété Content sur un ContentPresenter . La documentation ContentPresenter Class a ce bloc pertinent:

ContentPresenter utilise la logique suivante pour afficher le contenu:

  • Si la propriété ContentTemplate sur le ContentPresenter est définie, le ContentPresenter applique ce DataTemplate à la propriété Content et le UIElement résultant et ses éléments enfants, le cas échéant, sont affichés. Pour plus d'informations sur les objets DataTemplate, consultez Présentation des modèles de données.
  • Si la propriété ContentTemplateSelector sur le ContentPresenter est définie, le ContentPresenter applique le DataTemplate approprié à la propriété Content et le UIElement résultant et ses éléments enfants, le cas échéant, sont affichés.
  • S'il existe un DataTemplate associé au type de contenu, ContentPresenter applique ce DataTemplate à la propriété Content et le UIElement résultant et ses éléments enfants, le cas échéant, sont affichés.
  • Si Content est un objet UIElement, l'UIElement s'affiche. Si l'UIElement a déjà un parent, une exception se produit.
  • S'il existe un TypeConverter qui convertit le type de Contenu en UIElement, ContentPresenter utilise ce TypeConverter et l'UIElement résultant s'affiche.
  • S'il existe un TypeConverter qui convertit le type de contenu en chaîne, ContentPresenter utilise ce TypeConverter et crée un TextBlock pour contenir cette chaîne. Le TextBlock s'affiche.
  • Si le contenu est un XmlElement, la valeur de la propriété InnerText est affichée dans un TextBlock.
  • ContentPresenter appelle la méthode ToString sur le contenu et crée un TextBlock pour contenir la chaîne renvoyée par ToString. Le TextBlock s'affiche.

Dans le cas de la classe TextBlock , vous avez la possibilité de définir la propriété Text ou de définir la propriété Inlines. La définition de Text rendra simplement le texte. La définition de Inlines (qui est la valeur par défaut si vous placez du contenu dans le corps de la balise xaml) vous permet de formater votre texte. Par exemple, vous pouvez utiliser un Exécuter avec son FontWeight défini sur Bold pour mettre un mot ou une phrase en gras dans une phrase. Vous pouvez utiliser un LineBreak pour insérer une nouvelle ligne. Vous pouvez même utiliser un InlineUIContainer pour insérer des éléments d'interface utilisateur personnalisés dans le texte. Tout ce qui dérive de la classe Inline peut aller dans cette collection.

TextBlock est destiné aux simples bits de texte formaté. Si vous souhaitez des fonctionnalités de style de document encore plus puissantes, vous pouvez consulter FlowDocument , qui est utilisé par des contrôles tels que RichTextBox , FlowDocumentScrollViewer et - FlowDocumentReader .

En ce qui concerne la différence entre <TextBlock Text="something" /> et <TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>, il n'y a pas de différence. Ce sont simplement deux façons différentes par lesquelles vous pouvez définir des propriétés sur quelque chose dans un fichier xaml. La deuxième version est généralement utilisée uniquement lorsque vous devez définir des éléments supplémentaires à l'intérieur du setter.

31
Xavier

n court mot sur les "éléments de propriété"

Ceci est juste une remarque supplémentaire sur la grande réponse de Xaviers.

En fait, il n'y a pas beaucoup de différence entre:

<TextBlock Text="something" />

et

<TextBlock><TextBlock.Text>something</TextBlock.Text></TextBlock>

C'est parce que la propriété Text est de type String qui est un type simple qui peut être défini directement comme Text="something".

La dernière syntaxe dans l'exemple ci-dessus est appelée "éléments de propriété". Il est généralement utilisé lors de la définition de l'attribut d'un élément sur un type complexe.

Exemple:

<Button>
  <Button.Content>
     <Rectangle Height="20", Width="20", Fill="Black"/>
  </Button.Content>
</Button>

Dans cet exemple, vous pouvez définir le "rectangle" directement sans utiliser Button.Content, mais pour d'autres exemples, la syntaxe peut être utilisée pour définir un attribut d'un type complexe.

4
Martin