Est-il possible de sélectionner un bloc de texte WPF?

224

Comment autoriser TextBlockla sélection du texte de?

J'ai essayé de le faire fonctionner en affichant le texte en utilisant une TextBox en lecture seule de style ressemblant à un bloc de texte, mais cela ne fonctionnera pas dans mon cas car une TextBox n'a pas de ligne. En d'autres termes, comment le rendre sélectionnable?

Alan Le
la source
1
J'essaierai d'utiliser le contrôle RichTextBox pour voir si cela fonctionnera. Mais à partir d'une expérience antérieure, travailler avec la richtextbox est beaucoup plus impliqué.
Alan Le
Avez-vous pensé à utiliser un FlowDocumentScrollViewer, avec un FlowDocument contenant des paragraphes et des exécutions? - Cela fonctionne assez bien pour moi lorsque j'ai besoin de texte sélectionnable, et chaque paragraphe et chaque exécution peuvent être stylisés séparément.
BrainSlugs83
Après avoir essayé certaines des solutions de contournement ci-dessous, FlowDocumentScrollViewer était la voie à suivre. Il semble occuper un juste milieu entre RichTextBox et TextBlock.
Tom Makin
vote négatif pour accepter une réponse qui ne correspond pas à vos exigences.
Blechdose

Réponses:

218

Utilisez TextBoxplutôt un avec ces paramètres pour le rendre en lecture seule et pour ressembler à un TextBlockcontrôle.

<TextBox Background="Transparent"
         BorderThickness="0"
         Text="{Binding Text, Mode=OneWay}"
         IsReadOnly="True"
         TextWrapping="Wrap" />
MSB
la source
6
J'ai un projet qui contient de nombreux TextBlocks / Labels, je ne peux pas vraiment les transformer en TextBoxes. Ce que je veux faire, c'est ajouter un style magique applicable à tous à la ressource au niveau de l'application afin qu'il affecte tous les Label / TextBlock, et faire de leur présentateur de texte interne une TextBox en lecture seule, connaissez-vous une quelconque manière pour le faire?
Shimmy Weitzhandler
5
Vous pouvez ajouter IsTabStop = "False" en fonction de votre situation
Karsten
1
+1 Très belle solution! J'ai ajouté un Padding = "0", car dans mon projet le bas du texte a été coupé de ... Peut-être à cause d'un style ailleurs.
RESPAWNed
123
-1 La Question demande spécifiquement comment rendre un bloc de texte sélectionnable. Parce qu'il ne veut pas perdre la propriété "Inlines" (que les textBoxes n'ont pas). Cette «réponse» suggère simplement de faire ressembler une zone de texte à un bloc de texte.
00jt
19
@AlanLe Pourquoi avez-vous accepté cette réponse alors que c'est ce que vous avez explicitement dit que vous ne vouliez pas? Et pourquoi 147 personnes désemparées l'ont-elles voté?
Jim Balter
66

Toutes les réponses ici utilisent simplement un TextBoxou essaient d'implémenter la sélection de texte manuellement, ce qui conduit à de mauvaises performances ou à un comportement non natif (caret clignotant TextBox, pas de prise en charge du clavier dans les implémentations manuelles, etc.)

Après des heures à fouiller et à lire le code source WPF , j'ai découvert un moyen d'activer la sélection de texte WPF native pour les TextBlockcontrôles (ou vraiment tout autre contrôle). La plupart des fonctionnalités de sélection de texte sont implémentées dans la System.Windows.Documents.TextEditorclasse système.

Pour activer la sélection de texte pour votre contrôle, vous devez faire deux choses:

  1. Appelez TextEditor.RegisterCommandHandlers()une fois pour enregistrer les gestionnaires d'événements de classe

  2. Créer une instance de TextEditorchaque instance de votre classe et passer l'instance sous - jacente de votre System.Windows.Documents.ITextContainerà elle

Il est également nécessaire que la Focusablepropriété de votre contrôle soit définie sur True.

Ça y est ...! Cela semble facile, mais malheureusement, la TextEditorclasse est marquée comme interne. J'ai donc dû écrire un wrapper de réflexion autour de lui:

class TextEditorWrapper
{
    private static readonly Type TextEditorType = Type.GetType("System.Windows.Documents.TextEditor, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
    private static readonly PropertyInfo IsReadOnlyProp = TextEditorType.GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
    private static readonly PropertyInfo TextViewProp = TextEditorType.GetProperty("TextView", BindingFlags.Instance | BindingFlags.NonPublic);
    private static readonly MethodInfo RegisterMethod = TextEditorType.GetMethod("RegisterCommandHandlers", 
        BindingFlags.Static | BindingFlags.NonPublic, null, new[] { typeof(Type), typeof(bool), typeof(bool), typeof(bool) }, null);

    private static readonly Type TextContainerType = Type.GetType("System.Windows.Documents.ITextContainer, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
    private static readonly PropertyInfo TextContainerTextViewProp = TextContainerType.GetProperty("TextView");

    private static readonly PropertyInfo TextContainerProp = typeof(TextBlock).GetProperty("TextContainer", BindingFlags.Instance | BindingFlags.NonPublic);

    public static void RegisterCommandHandlers(Type controlType, bool acceptsRichContent, bool readOnly, bool registerEventListeners)
    {
        RegisterMethod.Invoke(null, new object[] { controlType, acceptsRichContent, readOnly, registerEventListeners });
    }

    public static TextEditorWrapper CreateFor(TextBlock tb)
    {
        var textContainer = TextContainerProp.GetValue(tb);

        var editor = new TextEditorWrapper(textContainer, tb, false);
        IsReadOnlyProp.SetValue(editor._editor, true);
        TextViewProp.SetValue(editor._editor, TextContainerTextViewProp.GetValue(textContainer));

        return editor;
    }

    private readonly object _editor;

    public TextEditorWrapper(object textContainer, FrameworkElement uiScope, bool isUndoEnabled)
    {
        _editor = Activator.CreateInstance(TextEditorType, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.CreateInstance, 
            null, new[] { textContainer, uiScope, isUndoEnabled }, null);
    }
}

J'ai également créé un SelectableTextBlockdérivé de TextBlockqui prend les étapes indiquées ci-dessus:

public class SelectableTextBlock : TextBlock
{
    static SelectableTextBlock()
    {
        FocusableProperty.OverrideMetadata(typeof(SelectableTextBlock), new FrameworkPropertyMetadata(true));
        TextEditorWrapper.RegisterCommandHandlers(typeof(SelectableTextBlock), true, true, true);

        // remove the focus rectangle around the control
        FocusVisualStyleProperty.OverrideMetadata(typeof(SelectableTextBlock), new FrameworkPropertyMetadata((object)null));
    }

    private readonly TextEditorWrapper _editor;

    public SelectableTextBlock()
    {
        _editor = TextEditorWrapper.CreateFor(this);
    }
}

Une autre option serait de créer une propriété jointe pour TextBlockpermettre la sélection de texte à la demande. Dans ce cas, pour désactiver à nouveau la sélection, il faut détacher un TextEditoren utilisant l'équivalent de réflexion de ce code:

_editor.TextContainer.TextView = null;
_editor.OnDetach();
_editor = null;
torvin
la source
1
comment utiliseriez-vous la classe SelectableTextBlock dans un autre xaml qui devrait la contenir?
Yoav Feuerstein
1
de la même manière que vous utiliseriez tout autre contrôle personnalisé. voir stackoverflow.com/a/3768178/332528 par exemple
torvin
3
@BillyWilloughby, votre solution émule simplement la sélection. Il manque beaucoup de fonctionnalités de sélection natives: prise en charge du clavier, menu contextuel, etc. Ma solution active la fonction de sélection native
torvin
3
Il semble que cette solution ne travail lorsque l' TextBlocka intégré Hyperlinks tant que le Hyperlinkn'est pas la dernière ligne en elle. L'ajout d'un vide de fin Runau contenu corrige quel que soit le problème sous-jacent qui entraîne le ExecutionEngineExceptionrejet.
Anton Tykhyy
2
C'est bien! Sauf si vous avez TextTrimming="CharacterEllipsis"sur le TextBlocket que la largeur disponible est insuffisante, si vous déplacez le pointeur de la souris sur le…, il se bloque avec System.ArgumentException "La distance demandée est en dehors du contenu du document associé." à System.Windows.Documents.TextPointer.InitializeOffset (position TextPointer, distance Int32, direction LogicalDirection) :( Je ne sais pas s'il existe une solution de contournement autre que de laisser TextTrimming défini sur Aucun.
Dave Huang
32

Je n'ai trouvé aucun exemple de réponse à la question. Toutes les réponses ont utilisé une Textbox ou une RichTextbox. J'avais besoin d'une solution qui me permettait d'utiliser un TextBlock, et c'est la solution que j'ai créée.

Je pense que la bonne façon de procéder consiste à étendre la classe TextBlock. C'est le code que j'ai utilisé pour étendre la classe TextBlock pour me permettre de sélectionner le texte et de le copier dans le presse-papiers. "sdo" est la référence d'espace de noms que j'ai utilisée dans le WPF.

WPF utilisant la classe étendue:

xmlns:sdo="clr-namespace:iFaceCaseMain"

<sdo:TextBlockMoo x:Name="txtResults" Background="Black" Margin="5,5,5,5" 
      Foreground="GreenYellow" FontSize="14" FontFamily="Courier New"></TextBlockMoo>

Code derrière pour la classe étendue:

public partial class TextBlockMoo : TextBlock 
{
    TextPointer StartSelectPosition;
    TextPointer EndSelectPosition;
    public String SelectedText = "";

    public delegate void TextSelectedHandler(string SelectedText);
    public event TextSelectedHandler TextSelected;

    protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        base.OnMouseDown(e);
        Point mouseDownPoint = e.GetPosition(this);
        StartSelectPosition = this.GetPositionFromPoint(mouseDownPoint, true);            
    }

    protected override void OnMouseUp(MouseButtonEventArgs e)
    {
        base.OnMouseUp(e);
        Point mouseUpPoint = e.GetPosition(this);
        EndSelectPosition = this.GetPositionFromPoint(mouseUpPoint, true);

        TextRange otr = new TextRange(this.ContentStart, this.ContentEnd);
        otr.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.GreenYellow));

        TextRange ntr = new TextRange(StartSelectPosition, EndSelectPosition);
        ntr.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.White));

        SelectedText = ntr.Text;
        if (!(TextSelected == null))
        {
            TextSelected(SelectedText);
        }
    }
}

Exemple de code de fenêtre:

    public ucExample(IInstanceHost host, ref String WindowTitle, String ApplicationID, String Parameters)
    {
        InitializeComponent();
        /*Used to add selected text to clipboard*/
        this.txtResults.TextSelected += txtResults_TextSelected;
    }

    void txtResults_TextSelected(string SelectedText)
    {
        Clipboard.SetText(SelectedText);
    }
Billy Willoughby
la source
1
Cela devrait être la réponse acceptée! Pas de piratage de réflexion, pas d'utilisation de TextBox ... Et il peut être facilement refactorisé en un comportement réutilisable. Très gentil merci!
Thomas Levesque
19

Appliquez ce style à votre TextBox et c'est tout (inspiré de cet article ):

<Style x:Key="SelectableTextBlockLikeStyle" TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="IsReadOnly" Value="True"/>
    <Setter Property="IsTabStop" Value="False"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Padding" Value="-2,0,0,0"/>
    <!-- The Padding -2,0,0,0 is required because the TextBox
        seems to have an inherent "Padding" of about 2 pixels.
        Without the Padding property,
        the text seems to be 2 pixels to the left
        compared to a TextBlock
    -->
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsMouseOver" Value="False" />
                <Condition Property="IsFocused" Value="False" />
            </MultiTrigger.Conditions>
            <Setter Property="Template">
                <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <TextBlock Text="{TemplateBinding Text}" 
                             FontSize="{TemplateBinding FontSize}"
                             FontStyle="{TemplateBinding FontStyle}"
                             FontFamily="{TemplateBinding FontFamily}"
                             FontWeight="{TemplateBinding FontWeight}"
                             TextWrapping="{TemplateBinding TextWrapping}"
                             Foreground="{DynamicResource NormalText}"
                             Padding="0,0,0,0"
                                       />
                </ControlTemplate>
                </Setter.Value>
            </Setter>
        </MultiTrigger>
    </Style.Triggers>
</Style>
sakito
la source
1
BTW à ce jour, le lien vers l'article semble mort
superjos
2
Autre ajout: le rembourrage devrait être -2,0, -2,0. À l'intérieur du TextBox, un contrôle TextBoxView est créé qui a une marge par défaut de 2,0,2,0. Malheureusement, vous ne pouvez pas redéfinir son style car il est marqué en interne.
fdub
11
Personne ne semble capable de lire. L'OP a besoin d'un TextBlock, pas d'un TextBox style comme un TextBlock.
Jim Balter
18

Créez ControlTemplate pour le TextBlock et placez un TextBox à l'intérieur avec le jeu de propriétés en lecture seule. Ou utilisez simplement TextBox et rendez-le en lecture seule, puis vous pouvez modifier TextBox.Style pour qu'il ressemble à TextBlock.

Jobi Joy
la source
11
Comment définissez-vous le ControlTemplate pour un TextBlock? Je ne trouve pas la propriété?
HaxElit
18
Cette approche ne fonctionnera pas si votre TextBlock contient des éléments en ligne. Que faire si vous avez des liens hypertexte ou des séquences de texte en gras ou en italique? TextBox ne les prend pas en charge.
dthrasher
1
Ne fonctionne pas si vous utilisez des exécutions en ligne et, comme l'a demandé HaxElit, je ne sais pas ce que vous entendez par modèle de contrôle.
Ritch Melton
7
-1 TextBlock n'a pas de ControlTemplate car il s'agit d'une sous-classe directe de FrameworkElement. TextBox, d'autre part, est une sous-classe de Control.
REVU
5
Pourquoi personne ne peut-il lire? L'OP a dit explicitement qu'un TextBlock est nécessaire, pas un TextBox, car TextBlock prend en charge le formatage en ligne et TextBox ne le fait pas. Pourquoi des réponses complètement erronées comme celle-ci reçoivent-elles de nombreux votes positifs?
Jim Balter
10

Je ne sais pas si vous pouvez rendre un TextBlock sélectionnable, mais une autre option serait d'utiliser un RichTextBox - c'est comme un TextBox comme vous l'avez suggéré, mais prend en charge la mise en forme que vous souhaitez.

Bruce
la source
1
J'ai essayé de le faire et, dans le processus, j'ai dû rendre la RichTextBox lisible avec une propriété de dépendance. Malheureusement, les anciens documents de flux ne sont pas éliminés correctement et la mémoire fuit comme un fou. Alan, je me demande si tu as trouvé un moyen de contourner ça?
John Noonan
@AlanLe De toutes les réponses ici, ce n'est qu'une des deux qui répond réellement à la question posée ... toutes les autres parlent de styliser un TextBox pour ressembler à un TextBlock, tout en ignorant le besoin de formatage. Il est bizarre et regrettable que le PO ait accepté l'une de ces non-réponses, au lieu de la bonne réponse pour utiliser RichTextBox plutôt que TextBox.
Jim Balter
9

Selon Windows Dev Center :

Propriété TextBlock.IsTextSelectionEnabled

[Mis à jour pour les applications UWP sur Windows 10. Pour les articles Windows 8.x, voir l' archive ]

Obtient ou définit une valeur qui indique si la sélection de texte est activée dans TextBlock , soit via l'action de l'utilisateur, soit en appelant l'API liée à la sélection.

Jack Pines
la source
5
Malheureusement, non compatible avec Win7 (parfois c'est une obligation)
Yury Schkatula
24
Amswer semble incorrect. IsTextSelectionEnabled est uniquement pour UWP, pas WPF - la question d'origine a spécifié WPF.
Puffin
6

Bien que la question dise «sélectionnable», je crois que les résultats intentionnels sont d'obtenir le texte dans le presse-papiers. Cela peut être facilement et élégamment réalisé en ajoutant un menu contextuel et un élément de menu appelé copie qui place la valeur de la propriété Textblock Text dans le presse-papiers. Juste une idée de toute façon.

SimperT
la source
4

TextBlock n'a pas de modèle. Donc, pour y parvenir, nous devons utiliser un TextBox dont le style est modifié pour se comporter comme un textBlock.

<Style x:Key="TextBlockUsingTextBoxStyle" BasedOn="{x:Null}" TargetType="{x:Type TextBox}">
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Padding" Value="1"/>
    <Setter Property="AllowDrop" Value="true"/>
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
    <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
    <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <TextBox BorderThickness="{TemplateBinding BorderThickness}" IsReadOnly="True" Text="{TemplateBinding Text}" Background="{x:Null}" BorderBrush="{x:Null}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Saraf Talukder
la source
Quels avantages cette approche offre-t-elle par rapport aux autres réponses? Je n'en vois aucun.
surfen
J'ai essayé ce style: TextBoxBorder n'est pas défini. Si vous le commentez, cela fonctionne bien
sthiers
Cet exemple de code est excellent, il montre comment obtenir la couleur par défaut d'un TextBlock.
Contango
1
C'est assez confus. Tout d'abord, la x: Key, "TextBlockUsingTextBoxStyle", est en arrière; il doit s'agir de "TextBoxUsingTextBlockStyle". Deuxièmement, l'OP savait déjà comment styler un TextBox comme un TextBlock, mais a répété à plusieurs reprises qu'il ne pouvait pas l'utiliser parce qu'il avait besoin de lignes intégrées pour le formatage.
Jim Balter du
2

Il existe une solution alternative qui pourrait être adaptable à la RichTextBox oultined dans ce billet de blog - il a utilisé un déclencheur pour échanger le modèle de contrôle lorsque l'utilisation survole le contrôle - devrait aider avec les performances

Richard
la source
1
Votre lien est mort. Veuillez inclure toutes les informations pertinentes dans une réponse et utiliser les liens uniquement à titre de citations.
Jim Balter
1

new TextBox
{
   Text = text,
   TextAlignment = TextAlignment.Center,
   TextWrapping = TextWrapping.Wrap,
   IsReadOnly = true,
   Background = Brushes.Transparent,
   BorderThickness = new Thickness()
         {
             Top = 0,
             Bottom = 0,
             Left = 0,
             Right = 0
         }
};

Lu55
la source
1
Ce n'est pas utile. Lisez la question pour voir ce que le PO voulait réellement.
Jim Balter du
1

Ajout à la réponse de @ torvin et comme @Dave Huang l'a mentionné dans les commentaires si vous avez TextTrimming="CharacterEllipsis"activé l'application se bloque lorsque vous survolez les points de suspension.

J'ai essayé d'autres options mentionnées dans le fil de discussion sur l'utilisation d'un TextBox mais cela ne semble vraiment pas être la solution non plus car il n'affiche pas les «points de suspension» et aussi si le texte est trop long pour s'adapter au conteneur en sélectionnant le contenu de la zone de texte "défile" en interne, ce qui n'est pas un comportement TextBlock.

Je pense que la meilleure solution est la réponse de @ torvin mais a le méchant crash lors du survol des ellipses.

Je sais que ce n'est pas joli, mais l'abonnement / le désabonnement en interne aux exceptions non gérées et la gestion de l'exception ont été le seul moyen que j'ai trouvé pour résoudre ce problème, veuillez partager si quelqu'un a une meilleure solution :)

public class SelectableTextBlock : TextBlock
{
    static SelectableTextBlock()
    {
        FocusableProperty.OverrideMetadata(typeof(SelectableTextBlock), new FrameworkPropertyMetadata(true));
        TextEditorWrapper.RegisterCommandHandlers(typeof(SelectableTextBlock), true, true, true);

        // remove the focus rectangle around the control
        FocusVisualStyleProperty.OverrideMetadata(typeof(SelectableTextBlock), new FrameworkPropertyMetadata((object)null));
    }

    private readonly TextEditorWrapper _editor;

    public SelectableTextBlock()
    {
        _editor = TextEditorWrapper.CreateFor(this);

        this.Loaded += (sender, args) => {
            this.Dispatcher.UnhandledException -= Dispatcher_UnhandledException;
            this.Dispatcher.UnhandledException += Dispatcher_UnhandledException;
        };
        this.Unloaded += (sender, args) => {
            this.Dispatcher.UnhandledException -= Dispatcher_UnhandledException;
        };
    }

    private void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        if (!string.IsNullOrEmpty(e?.Exception?.StackTrace))
        {
            if (e.Exception.StackTrace.Contains("System.Windows.Controls.TextBlock.GetTextPositionFromDistance"))
            {
                e.Handled = true;
            }
        }
    }
}
rauland
la source
0

J'ai implémenté SelectableTextBlock dans ma bibliothèque de contrôles opensource. Vous pouvez l'utiliser comme ceci:

<jc:SelectableTextBlock Text="Some text" />
Robert Važan
la source
4
Cela utilise simplement une TextBox, comme tant d'autres réponses de nombreuses années auparavant.
Chris
-1
Really nice and easy solution, exactly what I wanted !

J'apporte quelques petites modifications

public class TextBlockMoo : TextBlock 
{
    public String SelectedText = "";

    public delegate void TextSelectedHandler(string SelectedText);
    public event TextSelectedHandler OnTextSelected;
    protected void RaiseEvent()
    {
        if (OnTextSelected != null){OnTextSelected(SelectedText);}
    }

    TextPointer StartSelectPosition;
    TextPointer EndSelectPosition;
    Brush _saveForeGroundBrush;
    Brush _saveBackGroundBrush;

    TextRange _ntr = null;

    protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        base.OnMouseDown(e);

        if (_ntr!=null) {
            _ntr.ApplyPropertyValue(TextElement.ForegroundProperty, _saveForeGroundBrush);
            _ntr.ApplyPropertyValue(TextElement.BackgroundProperty, _saveBackGroundBrush);
        }

        Point mouseDownPoint = e.GetPosition(this);
        StartSelectPosition = this.GetPositionFromPoint(mouseDownPoint, true);            
    }

    protected override void OnMouseUp(MouseButtonEventArgs e)
    {
        base.OnMouseUp(e);
        Point mouseUpPoint = e.GetPosition(this);
        EndSelectPosition = this.GetPositionFromPoint(mouseUpPoint, true);

        _ntr = new TextRange(StartSelectPosition, EndSelectPosition);

        // keep saved
        _saveForeGroundBrush = (Brush)_ntr.GetPropertyValue(TextElement.ForegroundProperty);
        _saveBackGroundBrush = (Brush)_ntr.GetPropertyValue(TextElement.BackgroundProperty);
        // change style
        _ntr.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.Yellow));
        _ntr.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.DarkBlue));

        SelectedText = _ntr.Text;
    }
}
Titwan
la source
1
Vous devez expliquer ce que vous avez changé par rapport à la réponse ci-dessous, s'il vous plaît. -1
Alex Hope O'Connor
La ligne 51 donne: System.ArgumentNullException: 'La valeur ne peut pas être nulle. Nom du paramètre: position1 '
roule
-1
public MainPage()
{
    this.InitializeComponent();
    ...
    ...
    ...
    //Make Start result text copiable
    TextBlockStatusStart.IsTextSelectionEnabled = true;
}
Angel T
la source
Cela a été répondu comme tel ci-dessus ... et ne fonctionne que sur UWP et non WPF
ΩmegaMan Il y a