Liens de contenu dans les contrôles de texteContent links in text controls

Les liens de contenu offrent un moyen d'incorporer des données enrichies dans vos contrôles de texte, ce qui permet à l’utilisateur de trouver et d’utiliser plus d’informations sur une personne ou un lieu, sans quitter le contexte de votre application.Content links provide a way to embed rich data in your text controls, which lets a user find and use more information about a person or place without leaving the context of your app.

Important

Les fonctionnalités Windows qui autorisent les liens de contenu ne sont pas disponibles dans les versions de Windows postérieures à Windows 10 version 1903.The Windows features that enable content links are not available in versions of Windows after Windows 10 version 1903. Les liens de contenu pour les contrôles de texte XAML ne fonctionnent pas dans les versions de Windows ultérieures à la version 1903.Content links for XAML text controls will not function in versions of Windows later than version 1903.

Lorsque l’utilisateur préfixe une entrée avec le symbole (@) dans un contrôle RichEditBox, une liste de suggestions de personnes et/ou de lieux correspondant à l’entrée s'affiche.When the user prefixes an entry with the at (@) symbol in a RichEditBox, they’re shown a list of people and/or place suggestions that matches the entry. Si, par exemple, l’utilisateur sélectionne un lieu, un lien de type ContentLink vers ce lieu est inséré dans le texte.Then, for example, when the user picks a place, a ContentLink for that place is inserted into the text. Si l’utilisateur appelle le lien de contenu dans le contrôle RichEditBox, un menu volant s’affiche avec une carte et des informations supplémentaires sur le lieu en question.When the user invokes the content link from the RichEditBox, a flyout is shown with a map and additional info about the place.

API importantes : classe ContentLink, classe ContentLinkInfo, classe RichEditTextRangeImportant APIs: ContentLink class, ContentLinkInfo class, RichEditTextRange class

Notes

Les API pour obtenir des liens de contenu sont réparties sur les espaces de noms suivants : Windows.UI.Xaml.Controls, Windows.UI.Xaml.Documents et Windows.UI.Text.The APIs for content links are spread across the following namespaces: Windows.UI.Xaml.Controls, Windows.UI.Xaml.Documents, and Windows.UI.Text.

Vous pouvez utiliser les liens de contenu de deux façons :There are two distinct ways to use content links:

  1. Dans un RichEditBox, l’utilisateur peut ouvrir un sélecteur pour ajouter un lien de contenu en préfixant le texte avec un symbole @.In a RichEditBox, the user can open a picker to add a content link by prefixing text with an @ symbol. Le lien de contenu est stocké dans le cadre du contenu texte enrichi.The content link is stored as part the rich text content.
  2. Dans un contrôle TextBlock ou RichTextBlock, le lien de contenu est un élément de texte dont l'utilisation et le comportement sont très similaires à ceux d'un Lien hypertexte.In a TextBlock or RichTextBlock, the content link is a text element with usage and behavior much like a Hyperlink.

Voici à quoi ressemblent les liens de contenu par défaut dans un contrôle RichEditBox et dans un contrôle TextBlock.Here's how content links look by default in a RichEditBox and in a TextBlock.

lien de contenu dans une zone d’édition enrichie lien de contenu dans un bloc de textecontent link in rich edit box content link in text block

Les différences d’utilisation, de rendu et de comportement sont traitées en détail dans les sections suivantes.Differences in usage, rendering, and behavior are covered in detail in the following sections. Ce tableau vous donne une comparaison rapide des principales différences entre un lien de contenu dans un contrôle RichEditBox et dans un bloc de texte.This table gives a quick comparison of the main differences between a content link in a RichEditBox and a text block.

FonctionnalitéFeature RichEditBoxRichEditBox bloc de textetext block
UtilisationUsage Instance ContentLinkInfoContentLinkInfo instance Élément de texte ContentLinkContentLink text element
CurseurCursor Déterminé par type de lien de contenu, ne peut pas être modifiéDetermined by type of content link, can't be changed Déterminé par la propriété Cursor, null par défautDetermined by Cursor property, null by default
Info-bulleToolTip Pas de renduNot rendered Affiche un texte secondaireShows secondary text

L’utilisation d’un lien de contenu la plus courante consiste à permettre à un utilisateur d’ajouter rapidement des informations en préfixant le nom de la personne ou du lieu avec un symbole esperluette (@) dans son texte.The most common use of a content link is to let a user quickly add information by prefixing a person or place name with an ampersand (@) symbol in their text. Lors de l'activation dans un contrôle RichEditBox, cela ouvre un sélecteur et permet à l’utilisateur d’insérer une personne à partir de sa liste de contacts, ou un lieu à proximité, selon ce que vous avez activé.When enabled in a RichEditBox, this opens a picker and lets the user insert a person from their contact list, or a nearby place, depending on what you’ve enabled.

Le lien de contenu peut être enregistré avec le contenu de texte enrichi, et vous pouvez l'extraire pour l'utiliser dans d’autres parties de votre application.The content link can be saved with the rich text content, and you can extract it to use in other parts of your app. Par exemple, dans une application de messagerie, vous pouvez extraire les informations de la personne et les utiliser pour remplir la zone À avec une adresse e-mail.For example, in an email app, you might extract the person info and use it to populate the To box with an email address.

Notes

Le sélecteur de lien de contenu est une application qui fait partie de Windows. Il s'exécute donc dans un processus distinct de votre application.The content link picker is an app that’s part of Windows, so it runs in a separate process from your app.

Vous activez des liens de contenu dans un contrôle RichEditBox en ajoutant un ou plusieurs fournisseurs de liens de contenu à la collection RichEditBox.ContentLinkProviders.You enable content links in a RichEditBox by adding one or more content link providers to the RichEditBox.ContentLinkProviders collection. Deux fournisseurs de liens de contenu sont intégrés à l’infrastructure XAML.There are 2 content link providers built into the XAML framework.

Important

La valeur par défaut de la propriété RichEditBox.ContentLinkProviders est null, non une collection vide.The default value for the RichEditBox.ContentLinkProviders property is null, not an empty collection. Vous avez besoin de créer explicitement la ContentLinkProviderCollection avant d’ajouter des fournisseurs de liens de contenu.You need to explicity create the ContentLinkProviderCollection before you add content link providers.

Voici comment ajouter les fournisseurs de liens de contenu en XAML.Here’s how to add the content link providers in XAML.

<RichEditBox>
    <RichEditBox.ContentLinkProviders>
        <ContentLinkProviderCollection>
            <ContactContentLinkProvider/>
            <PlaceContentLinkProvider/>
        </ContentLinkProviderCollection>
    </RichEditBox.ContentLinkProviders>
</RichEditBox>

Vous pouvez également ajouter des fournisseurs de liens de contenu dans un Style et l’appliquer à plusieurs RichEditBoxes comme suit.You can also add content link providers in a Style and apply it to multiple RichEditBoxes like this.

<Page.Resources>
    <Style TargetType="RichEditBox" x:Key="ContentLinkStyle">
        <Setter Property="ContentLinkProviders">
            <Setter.Value>
                <ContentLinkProviderCollection>
                    <PlaceContentLinkProvider/>
                    <ContactContentLinkProvider/>
                </ContentLinkProviderCollection>
            </Setter.Value>
        </Setter>
    </Style>
</Page.Resources>

<RichEditBox x:Name="RichEditBox01" Style="{StaticResource ContentLinkStyle}" />
<RichEditBox x:Name="RichEditBox02" Style="{StaticResource ContentLinkStyle}" />

Voici comment ajouter des fournisseurs de liens de contenu dans le code.Here's how to add content link providers in code.

RichEditBox editor = new RichEditBox();
editor.ContentLinkProviders = new ContentLinkProviderCollection
{
    new ContactContentLinkProvider(),
    new PlaceContentLinkProvider()
};

L’apparence d’un lien de contenu est déterminée par son premier plan, son arrière-plan et son icône.The appearance of a content link is determined by its foreground, background, and icon. Dans un contrôle RichEditBox, vous pouvez définir les propriétés ContentLinkForegroundColor et ContentLinkBackgroundColor pour modifier les couleurs par défaut.In a RichEditBox, you can set the ContentLinkForegroundColor and ContentLinkBackgroundColor properties to change the default colors.

Vous ne pouvez pas définir le curseur.You can't set the cursor. Le curseur est restitué par le contrôle RichEditbox en fonction du type de lien de contenu - un curseur Person pour un lien vers une personne, ou un curseur Pin pour un lien vers un lieu.The cursor is rendered by the RichEditbox based on the type of content link - a Person cursor for a person link, or a Pin cursor for a place link.

L’objet ContentLinkInfoThe ContentLinkInfo object

Lorsque l’utilisateur effectue une sélection dans le sélecteur de personnes ou de lieux, le système crée un objet ContentLinkInfo et l’ajoute à la propriété ContentLinkInfo de l'actuel objet RichEditTextRange.When the user makes a selection from the people or places picker, the system creates a ContentLinkInfo object and adds it to the ContentLinkInfo property of the current RichEditTextRange.

L’objet ContentLinkInfo contient les informations qui permettent d'afficher, d'appeler et de gérer le lien de contenu.The ContentLinkInfo object contains the information used to display, invoke, and manage the content link.

  • DisplayText : il s’agit de la chaîne qui s’affiche lorsque le lien de contenu est restitué.DisplayText – This is the string that is shown when the content link is rendered. Dans un contrôle RichEditBox, l’utilisateur peut modifier le texte d’un lien de contenu après sa création, ce qui modifie la valeur de cette propriété.In a RichEditBox, the user can edit the text of a content link after it’s created, which alters the value of this property.
  • SecondaryText : cette chaîne est affichée dans l’info-bulle d’un lien de contenu rendu.SecondaryText – This string is shown in the ToolTip of a rendered content link.
    • Dans un lien de contenu de type Place créé par le sélecteur, elle contient l’adresse du lieu, si disponible.In a Place content link created by the picker, it contains the address of the location, if available.
  • Uri : lien vers plus d’informations sur l’objet de la liaison de contenu.Uri – The link to more information about the subject of the content link. Cet Uri peut ouvrir une application installée ou un site Web.This Uri can open an installed app or a website.
  • Id : il s’agit d'un compteur par contrôle en lecture seule, créé par le contrôle RichEditBox.Id - This is a read-only, per control, counter created by the RichEditBox control. Il sert à suivre cette propriété ContentLinkInfo au cours d'actions telles que la suppression ou la modification.It’s used to track this ContentLinkInfo during actions such as delete or edit. Si la propriété ContentLinkInfo est coupée et recollée dans le contrôle, elle obtiendra de nouvelles valeurs d’ID. Les valeurs d’ID sont incrémentielles.If the ContentLinkInfo is cut and paste back into the control, it will get a new Id. Id values are incremental.
  • LinkContentKind : chaîne qui décrit le type de liaison de contenu.LinkContentKind – A string that describes the type of the content link. Les types de contenu intégrés sont Places et Contacts.The built-in content types are Places and Contacts. La valeur est sensible à la casse.The value is case sensitive.

Il existe plusieurs situations où le LinkContentKind est important.There are several situations where the LinkContentKind is important.

  • Lorsqu’un utilisateur copie un lien de contenu dans un contrôle RichEditBox et le colle dans un autre contrôle RichEditBox, les deux contrôles doivent avoir un ContentLinkProvider pour ce type de contenu.When a user copies a content link from a RichEditBox and pastes it into another RichEditBox, both controls must have a ContentLinkProvider for that content type. Si ce n’est pas le cas, le lien est collé sous forme de texte.If not, the link is pasted as text.
  • Vous pouvez utiliser LinkContentKind dans un gestionnaire d’événements ContentLinkChanged pour déterminer comment traiter un lien de contenu lorsque vous l’utilisez dans d’autres parties de votre application.You can use LinkContentKind in a ContentLinkChanged event handler to determine what to do with a content link when you use it in other parts of your app. Voir la section Exemple pour plus d'informations.See the Example section for more info.
  • Le LinkContentKind influence la façon dont le système ouvre l’Uri lorsque le lien est appelé.The LinkContentKind influences how the system opens the Uri when the link is invoked. Nous allons le voir ensuite dans la discussion sur le lancement d'Uri.We’ll see this in the discussion of Uri launching next.

Lancement d’URIUri launching

La propriété Uri fonctionne de façon similaire à la propriété NavigateUri d’un lien hypertexte.The Uri property works much like the NavigateUri property of a Hyperlink. Lorsqu’un utilisateur clique dessus, elle lance l’Uri dans le navigateur par défaut, ou dans l’application enregistrée pour le protocole particulier spécifié dans la valeur de l’Uri.When a user clicks it, it launches the Uri in the default browser, or in the app that's registered for the particular protocol specified in the Uri value.

Le comportement spécifique des 2 types de lien de contenu intégrés sont décrits ici.The specific behavior for the 2 built in kinds of link content are described here.

PlacesPlaces

Le sélecteur Places crée une propriété ContentLinkInfo avec une racine d'Uri de https://maps.windows.com/.The Places picker creates a ContentLinkInfo with a Uri root of https://maps.windows.com/. Ce lien peut être ouvert de 3 manières différentes :This link can be opened in 3 ways:

  • Si LinkContentKind = « Places », il ouvre une fiche d’informations dans un menu volant.If LinkContentKind = "Places", it opens an info card in a flyout. Le menu volant est similaire à celui du sélecteur de lien de contenu.The flyout is similar to the content link picker flyout. Il fait partie de Windows et s’exécute dans un processus distinct de votre application.It’s part of Windows, and runs in a separate process from your app.
  • Si LinkContentKind n’est pas « Places », il tente d’ouvrir l'application Cartes à l’endroit spécifié.If LinkContentKind is not "Places", it attempts to open the Maps app to the specified location. Par exemple, cela peut se produire si vous avez modifié le LinkContentKind dans le Gestionnaire d’événements ContentLinkChanged.For example, this can happen if you’ve modified the LinkContentKind in the ContentLinkChanged event handler.
  • Si l’Uri ne peut pas être ouvert dans l’application Cartes, la carte est ouverte dans le navigateur par défaut.If the Uri can’t be opened in the Maps app, the map is opened in the default browser. Cela se produit généralement lorsque les paramètres Applications pour les sites web de l’utilisateur n'autorisent pas l’ouverture de l’Uri avec l'application Cartes.This typically happens when the user's Apps for websites settings don’t allow opening the Uri with the Maps app.
PersonnesPeople

Le sélecteur People crée un ContentLinkInfo avec un Uri qui utilise le protocole ms-people.The People picker creates a ContentLinkInfo with a Uri that uses the ms-people protocol.

  • Si LinkContentKind = « People », il ouvre une fiche d’informations dans un menu volant.If LinkContentKind = "People", it opens an info card in a flyout. Le menu volant est similaire à celui du sélecteur de lien de contenu.The flyout is similar to the content link picker flyout. Il fait partie de Windows et s’exécute dans un processus distinct de votre application.It’s part of Windows, and runs in a separate process from your app.
  • Si LinkContentKind n’est pas « People », il ouvre l'application Contacts.If LinkContentKind is not "People", it opens the People app. Par exemple, cela peut se produire si vous avez modifié le LinkContentKind dans le Gestionnaire d’événements ContentLinkChanged.For example, this can happen if you’ve modified the LinkContentKind in the ContentLinkChanged event handler.

Conseil

Pour plus d’informations sur l’ouverture d’autres applications et sites Web à partir de votre application, consultez les rubriques sous Lancer une application avec un Uri.For more info about opening other apps and websites from your app, see the topics under Launch an app with a Uri.

InvokedInvoked

Lorsque l’utilisateur appelle un lien de contenu, l'événement ContentLinkInvoked se déclenche avant que le comportement par défaut du lancement de l’Uri ne se produise.When the user invokes a content link, the ContentLinkInvoked event is raised before the default behavior of launching the Uri happens. Vous pouvez gérer cet événement pour remplacer ou annuler le comportement par défaut.You can handle this event to override or cancel the default behavior.

Cet exemple montre comment vous pouvez remplacer le comportement de lancement par défaut d’un lien de contenu de type Place.This example shows how you can override the default launching behavior for a Place content link. Au lieu d’ouvrir la carte dans une fiche d’informations Place, l'application Cartes ou le navigateur web par défaut, vous marquez l’événement comme Géré et ouvrez la carte dans un contrôle WebView dans l’application.Instead of opening the map in a Place info card, Maps app, or default web browser, you mark the event as Handled and open the map in an in-app WebView control.

<RichEditBox x:Name="editor"
             ContentLinkInvoked="editor_ContentLinkInvoked">
    <RichEditBox.ContentLinkProviders>
        <ContentLinkProviderCollection>
            <PlaceContentLinkProvider/>
        </ContentLinkProviderCollection>
    </RichEditBox.ContentLinkProviders>
</RichEditBox>

<WebView x:Name="webView1"/>
private void editor_ContentLinkInvoked(RichEditBox sender, ContentLinkInvokedEventArgs args)
{
    if (args.ContentLinkInfo.LinkContentKind == "Places")
    {
        args.Handled = true;
        webView1.Navigate(args.ContentLinkInfo.Uri);
    }
}

ContentLinkChangedContentLinkChanged

Vous pouvez utiliser l'événement ContentLinkChanged pour être informé lorsqu’un lien de contenu est ajouté, modifié ou supprimé.You can use the ContentLinkChanged event to be notified when a content link is added, modified, or removed. Cela vous permet d’extraire le lien de contenu du texte et de l’utiliser à d’autres endroits dans votre application.This lets you extract the content link from the text and use it in other places in your app. Cela est illustré plus loin dans la section Exemples.This is shown later in the Examples section.

Les propriétés de l'objet ContentLinkChangedEventArgs sont :The properties of the ContentLinkChangedEventArgs are:

  • ChangedKind : cette énumération ContentLinkChangeKind est l’action contenue dans le ContentLink.ChangedKind - This ContentLinkChangeKind enum is the action within the ContentLink. Par exemple, si le ContentLink est inséré, supprimé ou modifié.For example, if the ContentLink is inserted, removed, or edited.
  • Info : le ContentLinkInfo qui était la cible de l’action.Info - The ContentLinkInfo that was the target of the action.

Cet événement est déclenché pour chaque action ContentLinkInfo.This event is raised for each ContentLinkInfo action. Par exemple, si l’utilisateur copie et colle plusieurs liens de contenu dans le contrôle RichEditBox à la fois, cet événement se déclenche pour chaque élément ajouté.For example, if the user copies and pastes several content links into the RichEditBox at once, this event is raised for each added item. Ou, si l’utilisateur sélectionne et supprime plusieurs liens de contenu en même temps, cet événement se déclenche pour chaque élément supprimé.Or if the user selects and deletes several content links at the same time, this event is raised for each deleted item.

Cet événement se déclenche sur le contrôle RichEditBox après l'événement TextChanging et avant l'événement TextChanged.This event is raised on the RichEditBox after the TextChanging event and before the TextChanged event.

Vous pouvez utiliser la propriété RichEditTextRange.ContentLink pour obtenir un lien de contenu à partir d’un document d’édition enrichie.You can use the RichEditTextRange.ContentLink property to get a content link from a rich edit document. L’énumération TextRangeUnit a la valeur ContentLink pour spécifier le lien de contenu comme unité à utiliser lors de la navigation dans une plage de texte.The TextRangeUnit enumeration has the value ContentLink to specify the content link as a unit to use when navigating a text range.

Cet exemple montre comment énumérer tous les liens de contenu dans un contrôle RichEditBox et extraire les contacts dans une liste.This example shows how you can enumerate all the content links in a RichEditBox, and extract the people into a list.

<StackPanel Width="300">
    <RichEditBox x:Name="Editor" Height="200">
        <RichEditBox.ContentLinkProviders>
            <ContentLinkProviderCollection>
                <ContactContentLinkProvider/>
                <PlaceContentLinkProvider/>
            </ContentLinkProviderCollection>
        </RichEditBox.ContentLinkProviders>
    </RichEditBox>

    <Button Content="Get people" Click="Button_Click"/>

    <ListView x:Name="PeopleList" Header="People">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="ContentLinkInfo">
                <TextBlock>
                    <ContentLink Info="{x:Bind}" Background="Transparent"/>
                </TextBlock>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackPanel>
private void Button_Click(object sender, RoutedEventArgs e)
{
    PeopleList.Items.Clear();
    RichEditTextRange textRange = Editor.Document.GetRange(0, 0) as RichEditTextRange;

    do
    {
        // The Expand method expands the Range EndPosition 
        // until it finds a ContentLink range. 
        textRange.Expand(TextRangeUnit.ContentLink);
        if (textRange.ContentLinkInfo != null
            && textRange.ContentLinkInfo.LinkContentKind == "People")
        {
            PeopleList.Items.Add(textRange.ContentLinkInfo);
        }
    } while (textRange.MoveStart(TextRangeUnit.ContentLink, 1) > 0);
}

Pour utiliser un lien de contenu dans un contrôle TextBlock ou RichTextBlock, vous utilisez l'élément de texte ContentLink (à partir de l'espace de noms Windows.UI.Xaml.Documents).To use a content link in a TextBlock or RichTextBlock control, you use the ContentLink text element (from the Windows.UI.Xaml.Documents namespace).

Les sources courantes d'un ContentLink dans un bloc de texte sont :Typical sources for a ContentLink in a text block are:

  • Un lien de contenu créé par un sélecteur que vous avez extrait à partir d’un contrôle RichTextBlock.A content link created by a picker that you extracted from a RichTextBlock control.
  • Un lien de contenu vers un lieu que vous créez dans votre code.A content link for a place that you create in your code.

Pour les autres cas, un élément de texte Hyperlink est généralement approprié.For other situations, a Hyperlink text element is usually appropriate.

L’apparence d’un lien de contenu est déterminée par son premier plan, son arrière-plan et son curseur.The appearance of a content link is determined by its foreground, background, and cursor. Dans un bloc de texte, vous pouvez définir les propriétés Foreground (à partir de TextElement) et Background pour modifier les couleurs par défaut.In a text block, you can set the Foreground (from TextElement) and Background properties to change the default colors.

Par défaut, le curseur Hand s'affiche lorsque l’utilisateur pointe sur le lien de contenu.By default, the Hand cursor is shown when the user hovers over the content link. À la différence du contrôle RichEditBlock, les contrôles de bloc de texte ne modifient pas le curseur automatiquement en fonction du type de lien.Unlike RichEditBlock, text block controls don't change the cursor automatically based on the link type. Vous pouvez définir la propriété Cursor pour modifier le curseur en fonction du type de lien ou d’autres facteurs.You can set the Cursor property to change the cursor based on link type or other factors.

Voici un exemple de ContentLink utilisé dans un contrôle TextBlock.Here's an example of a ContentLink used in a TextBlock. Le ContentLinkInfo est créé dans le code et affecté à la propriété Info de l’élément de texte ContentLink qui est créé en XAML.The ContentLinkInfo is created in code and assigned to the Info property of the ContentLink text element that's created in XAML.

<StackPanel>
    <TextBlock>
        <Span xml:space="preserve">
            <Run>This valcano erupted in 1980: </Run><ContentLink x:Name="placeContentLink" Cursor="Pin"/>
            <LineBreak/>
        </Span>
    </TextBlock>

    <Button Content="Show" Click="Button_Click"/>
</StackPanel>
private void Button_Click(object sender, RoutedEventArgs e)
{
    var info = new Windows.UI.Text.ContentLinkInfo();
    info.DisplayText = "Mount St. Helens";
    info.SecondaryText = "Washington State";
    info.LinkContentKind = "Places";
    info.Uri = new Uri("https://maps.windows.com?cp=46.1912~-122.1944");
    placeContentLink.Info = info;
}

Conseil

Quand vous utilisez un ContentLink dans un contrôle de texte avec d’autres éléments de texte en XAML, placez le contenu dans un conteneur Span et appliquez l’attribut xml:space="preserve" au conteneur Span pour conserver l’espace entre le ContentLink et d'autres éléments.When you use a ContentLink in a text control with other text elements in XAML, place the content in a Span container and apply the xml:space="preserve" attribute to the Span to keep the white space between the ContentLink and other elements.

ExemplesExamples

Dans cet exemple, un utilisateur peut entrer un lien de contenu vers une personne ou un lieu dans un contrôle RickTextBlock.In this example, a user can enter a person or place content link into a RickTextBlock. Vous gérez l’événement ContentLinkChanged pour extraire les liens de contenu et les garder à jour dans une liste de contacts ou dans une liste de lieux.You handle the ContentLinkChanged event to extract the content links and keep them up-to-date in either a people list or places list.

Dans les modèles d’élément des listes, vous utilisez un contrôle TextBlock avec un élément de texte ContentLink pour afficher les informations de lien de contenu.In the item templates for the lists, you use a TextBlock with a ContentLink text element to show the content link info. Le contrôle ListView fournit son propre arrière-plan pour chaque élément, donc l’arrière-plan du ContentLink est défini sur Transparent.The ListView provides its own background for each item, so the ContentLink background is set to Transparent.

<StackPanel Orientation="Horizontal" Grid.Row="1">
    <RichEditBox x:Name="Editor"
                 ContentLinkChanged="Editor_ContentLinkChanged"
                 Margin="20" Width="300" Height="200"
                 VerticalAlignment="Top">
        <RichEditBox.ContentLinkProviders>
            <ContentLinkProviderCollection>
                <ContactContentLinkProvider/>
                <PlaceContentLinkProvider/>
            </ContentLinkProviderCollection>
        </RichEditBox.ContentLinkProviders>
    </RichEditBox>

    <ListView x:Name="PeopleList" Header="People">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="ContentLinkInfo">
                <TextBlock>
                    <ContentLink Info="{x:Bind}"
                                 Background="Transparent"
                                 Cursor="Person"/>
                </TextBlock>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

    <ListView x:Name="PlacesList" Header="Places">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="ContentLinkInfo">
                <TextBlock>
                    <ContentLink Info="{x:Bind}"
                                 Background="Transparent"
                                 Cursor="Pin"/>
                </TextBlock>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackPanel>
private void Editor_ContentLinkChanged(RichEditBox sender, ContentLinkChangedEventArgs args)
{
    var info = args.ContentLinkInfo;
    var change = args.ChangeKind;
    ListViewBase list = null;

    // Determine whether to update the people or places list.
    if (info.LinkContentKind == "People")
    {
        list = PeopleList;
    }
    else if (info.LinkContentKind == "Places")
    {
        list = PlacesList;
    }

    // Determine whether to add, delete, or edit.
    if (change == ContentLinkChangeKind.Inserted)
    {
        Add();
    }
    else if (args.ChangeKind == ContentLinkChangeKind.Removed)
    {
        Remove();
    }
    else if (change == ContentLinkChangeKind.Edited)
    {
        Remove();
        Add();
    }

    // Add content link info to the list. It's bound to the
    // Info property of a ContentLink in XAML.
    void Add()
    {
        list.Items.Add(info);
    }

    // Use ContentLinkInfo.Id to find the item,
    // then remove it from the list using its index.
    void Remove()
    {
        var items = list.Items.Where(i => ((ContentLinkInfo)i).Id == info.Id);
        var item = items.FirstOrDefault();
        var idx = list.Items.IndexOf(item);

        list.Items.RemoveAt(idx);
    }
}