WPF metin bloğunu seçilebilir hale getirmenin herhangi bir yolu var mı?


224

TextBlockMetninin seçilebilir olmasına nasıl izin verilir ?

Ben bir textblock gibi görünmek için tarz bir salt okunur TextBox kullanarak metin görüntüleyerek işe almak için çalıştı ama bir TextBox satır içi olmadığı için bu benim durumumda çalışmaz. Başka bir deyişle, nasıl seçilebilir hale getirilir?


1
Bunun işe yarayıp yaramayacağını görmek için RichTextBox denetimini kullanmayı deneyeceğim. Ancak, önceki deneyimlerden zengin metin kutusu ile çalışmak çok daha fazla ilgili.
Alan Le

Paragraflar ve Çalışmalar içeren bir FlowDocument ile bir FlowDocumentScrollViewer kullanmayı düşündünüz mü? - Seçilebilir metne ihtiyacım olduğunda bu benim için oldukça iyi çalışıyor ve her Paragraf ve Çalıştırma ayrı olarak şekillendirilebilir.
15:58

Aşağıdaki geçici çözümlerden bazılarını denedikten sonra, FlowDocumentScrollViewer ileriye giden yoldu. RichTextBox ve TextBlock arasında kullanışlı bir orta alan işgal ediyor gibi görünüyor.
Tom Makin

Gereksinimlerinize uymayan bir cevabı kabul etmek için oy verin.
Blechdose

Yanıtlar:


218

Salt TextBoxokunur yapmak ve bir TextBlockkontrole benzemek için bu ayarlarla a kullanın .

<TextBox Background="Transparent"
         BorderThickness="0"
         Text="{Binding Text, Mode=OneWay}"
         IsReadOnly="True"
         TextWrapping="Wrap" />

6
Birçok TextBlocks / etiket içeren bir proje var, gerçekten onları TextBoxes dönüştürmek olamaz. Yapmak istediğim şey, tüm Label / TextBlock'u etkilemesi ve dahili metin sunumlarını salt okunur bir TextBox olarak yapması için uygulama düzeyindeki kaynağa sihirli bir uygula-Stili eklemektir. yapmak için?
Shimmy Weitzhandler

5
Durumunuza bağlı olarak IsTabStop = "False" eklemek isteyebilirsiniz
Karsten

1
+1 Çok güzel bir çözüm! Bir Padding = "0" ekledim, çünkü projemde metnin alt kısmı kesildi ... Belki başka bir yerdeki bir stil yüzünden.
respawned

123
-1 Soru özellikle bir metin bloğunun nasıl seçilebilir hale getirileceğini soruyor. Çünkü "Inlines" özelliğini kaybetmek istemiyor (textBox'larda olmayan). Bu 'cevap' sadece bir metin kutusunun metin bloğu gibi görünmesini önerir.
00jt

19
@AlanLe Bu cevabı neden istemediğinizi açıkça söylediğiniz zaman kabul ettiniz? Ve neden 147 clueless kişi onu onayladı?
Jim Balter

66

Buradaki tüm cevaplar sadece bir TextBoxveya metin seçimini manuel olarak uygulamaya çalışıyor, bu da düşük performansa veya yerel olmayan davranışlara (yanıp sönen işaretTextBox , manuel uygulamalarda klavye desteği yok vb.)

Saatlerce kazma ve WPF kaynak kodunu okuduktan sonra , bunun yerine TextBlockkontroller (veya gerçekten diğer kontroller) için yerel WPF metin seçimini etkinleştirmenin bir yolunu keşfettim . Metin seçimiyle ilgili işlevlerin çoğu,System.Windows.Documents.TextEditor sistem sınıfında uygulanır.

Kontrolünüz için metin seçimini etkinleştirmek için iki şey yapmanız gerekir:

  1. TextEditor.RegisterCommandHandlers()Sınıf olay işleyicilerini kaydetmek için bir kez arayın

  2. Bir örneğini oluşturma TextEditorsınıfın her örneği için ve aramalarınızdan yatan örneğini geçmesi System.Windows.Documents.ITextContainerbuna

Ayrıca, denetiminizin FocusablemülkününTrue .

Budur! Kulağa kolay geliyor, ancak maalesef TextEditorsınıf dahili olarak işaretleniyor. Bu yüzden etrafına bir yansıma sarıcı yazmak zorunda kaldım:

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);
    }
}

Ayrıca yukarıda belirtilen adımları alır bir SelectableTextBlocktüretilmiş yarattı TextBlock:

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);
    }
}

Başka bir seçenek TextBlock, istek üzerine metin seçimini etkinleştirmek için ekli bir özellik oluşturmak olacaktır . Bu durumda, seçimi tekrar devre dışı bırakmak için TextEditor, bu kodun yansıma eşdeğerini kullanarak a'nın ayrılması gerekir :

_editor.TextContainer.TextView = null;
_editor.OnDetach();
_editor = null;

1
onu içeren başka bir xaml içinde SelectableTextBlock sınıfını nasıl kullanırsınız?
Yoav Feuerstein

1
aynı şekilde başka bir özel kontrol kullanırsınız. bkz. stackoverflow.com/a/3768178/332528 örneğin
torvin

3
@BillyWilloughby çözümünüz sadece seçimi taklit eder. Birçok yerel seçim özelliği yok: klavye desteği, bağlam menüsü vb. Benim çözümüm yerel seçim özelliğini etkinleştiriyor
torvin

3
Görünüşe göre bu çözüm , içerideki son satır içi olmadığı sürece TextBlockgömülü olduğunda işe yarıyor . İçeriğe boş bir boşluk eklenmesi , temel sorun ne olursa olsun atılmayla sonuçlanan sorunu düzeltir . HyperlinkHyperlinkRunExecutionEngineException
Anton Tykhyy

2
Bu harika! Eğer varsa hariç TextTrimming="CharacterEllipsis"üzerinde TextBlockve üzerinde fareyi hareket varsa genişlik, yetersizdir ... bu System.ArgumentException çöküyor "Talep edilen mesafe ilişkili belgenin içeriği dışındadır." SystemTWindows.Documents.TextPointer.InitializeOffset (TextPointer konumu, Int32 mesafesi, LogicalDirection yönü) :( TextTrimming'i None olarak bırakmak dışında bir geçici çözüm olup olmadığını bilmiyorum
Dave Huang

32

Soruyu gerçekten cevaplamak için herhangi bir örnek bulamadım. Tüm cevaplar bir Textbox veya RichTextbox kullandı. Bir TextBlock kullanmama izin veren bir çözüme ihtiyacım vardı ve bu benim oluşturduğum çözüm.

Bunu yapmak için doğru yolu TextBlock sınıfını genişletmek olduğuna inanıyorum. Bu, metni seçip panoya kopyalamama izin vermek için TextBlock sınıfını genişletmek için kullandığım kod. "sdo", WPF'de kullandığım ad alanı başvurusudur.

Genişletilmiş Sınıfı Kullanan WPF:

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>

Genişletilmiş Sınıfın Arkasındaki Kod:

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);
        }
    }
}

Örnek Pencere Kodu:

    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);
    }

1
Bu kabul edilen cevap olmalı! Hiçbir yansıma kesmek, bir TextBox kullanmadan ... Ve kolayca yeniden kullanılabilir bir davranış içine yeniden düzenlenebilir. Çok hoş teşekkürler!
Thomas Levesque

19

Sizin TextBox bu stili uygulayın ve bu (ilham bu kadar bu makalede ):

<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>

1
BTW bugün itibariyle, makaleye bağlantı ölü gibi görünüyor
superjos

2
Başka bir ekleme: Dolgu -2,0, -2,0 olmalıdır. TextBox içinde, 2,0,2,0 varsayılan kenar boşluğuna sahip bir TextBoxView denetimi oluşturulur. Maalesef, dahili olarak işaretlendiği için Stilini yeniden tanımlayamazsınız.
fdub

11
Kimse okuyamıyor gibi görünüyor. OP, TextBlock gibi stilize edilmiş bir TextBox'a değil, bir TextBlock'a ihtiyaç duyar.
Jim Balter

18

TextBlock için ControlTemplate oluşturun ve salt okunur özellik kümesine bir TextBox koyun. Veya yalnızca TextBox'ı kullanın ve salt okunur hale getirin, o zaman TextBox.Style'ı TextBlock gibi görünmesi için değiştirebilirsiniz.


11
Bir TextBlock için ControlTemplate'i nasıl ayarlarsınız? Mülkü bulamıyorum?
HaxElit

18
TextBlock öğenizde satır içi öğeler varsa bu yaklaşım işe yaramaz. Ya köprüler veya kalın ya da italik metinler varsa? TextBox bunları desteklemiyor.
dthrasher

1
Satır içi çalıştırma kullanıyorsanız ve HaxElit'in sorduğu gibi çalışmazsa, kontrol şablonu ile ne demek istediğinizden emin değilim.
Ritch Melton

7
-1 TextBlock öğesinin, FrameworkElement öğesinin doğrudan alt sınıfı olması nedeniyle bir ControlTemplate'i yoktur. Diğer yandan TextBox, Control'ün bir alt sınıfıdır.
21'de reSPAWNed

5
Neden kimse okuyamıyor? OP, TextBlock satır içi biçimlendirmeyi desteklediğinden ve TextBox desteklemediğinden, TextBox'a değil, TextBlock'a ihtiyaç duyulduğunu açıkça belirtti. Neden tamamen yanlış çöp cevapları çok sayıda oy alıyor?
Jim Balter

10

Bir TextBlock seçilebilir yapabilirsiniz emin değilim, ama başka bir seçenek bir RichTextBox kullanmak olacaktır - önerdiğiniz gibi bir TextBox gibi, ama istediğiniz biçimlendirmeyi destekler.


1
Bunu yapmayı denedim ve süreçte RichTextBox'ı bir bağımlılık özelliği ile satılabilir yapmak zorunda kaldım. Ne yazık ki eski akış belgeleri düzgün bir şekilde atılmıyor ve bellek çılgın gibi akıyor. Alan, merak ettim bunun için bir yol mu buldun?
John Noonan

@AlanLe Buradaki tüm yanıtlardan, bu aslında sorulan soruya cevap veren iki kişiden sadece biri ... Diğerleri biçimlendirme ihtiyacını göz ardı ederken bir TextBox gibi görünmek için bir TextBox şekillendirmekten bahsediyor. OP'nin TextBox yerine RichTextBox'ı kullanmak için doğru cevap yerine bu cevapsızlardan birini kabul etmesi tuhaf ve talihsiz bir durumdur.
Jim Balter

9

Göre , Windows Dev Center :

TextBlock.IsTextSelectionEnabled özelliği

[Windows 10'daki UWP uygulamaları için güncellendi. Windows 8.x makaleleri için arşive bakın ]

Alır veya metin seçimi etkin olup olmadığını gösteren bir değeri ayarlar TextBlock kullanıcı eylemi ya da seleksiyon ilgili API çağırarak yoluyla ya.


5
Ne yazık ki, Win7 ile uyumlu değil (bazen bir zorunluluktur)
Yury Schkatula

24
Amswer yanlış görünüyor. IsTextSelectionEnabled yalnızca UWP içindir, WPF için değildir - orijinal soru WPF belirtmiştir.
Puffin

6

Soru 'Seçilebilir' derken kasıtlı sonuçların metni panoya almak olduğuna inanıyorum. Bu, bir Bağlam Menüsü ve Textblock Text özellik değerini panoya koyan copy adlı menü öğesi eklenerek kolayca ve zarif bir şekilde elde edilebilir. Her neyse, sadece bir fikir.


4

TextBlock'ta bir şablon yok. Bunu başarmak için, tarzı bir textBlock olarak davranacak şekilde değiştirilen bir TextBox kullanmamız gerekiyor.

<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>

Bu yaklaşım diğer cevaplara kıyasla ne gibi avantajlar sunuyor? Ben görmüyorum.
surfen

Bu stili denedim: TextBoxBorder tanımlanmamış. Eğer yorum yaparsanız, iyi çalışır
sthiers

Bu örnek kod mükemmel, bir TextBlock için varsayılan rengin nasıl alınacağını gösterir.
Contango

1
Bu oldukça karışık. İlk olarak, x: Key, "TextBlockUsingTextBoxStyle" geriye doğru; "TextBoxUsingTextBlockStyle" olmalıdır. İkincisi, OP zaten TextBlock gibi bir TextBox'ı nasıl stilize edeceğini biliyordu, ama tekrar tekrar bunu kullanamayacağını söyledi çünkü biçimlendirme için satırlara ihtiyacı vardı.
Jim Balter

2

Bu blog gönderisinde atlanan RichTextBox'a uyarlanabilecek alternatif bir çözüm var - kullanım kontrolün üzerine geldiğinde kontrol şablonunu değiştirmek için bir tetikleyici kullandı - performansa yardımcı olmalı


1
Bağlantınız öldü. Lütfen ilgili tüm bilgileri bir cevaba ekleyin ve bağlantıları yalnızca alıntı olarak kullanın.
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
         }
};


1
Bu yardımcı olmuyor. OP'nin gerçekte ne istediğini görmek için soruyu okuyun.
Jim Balter

1

@ Torvin cevabına ve @Dave Huang'ın yorumlarınızda belirtildiği gibi ekleme TextTrimming="CharacterEllipsis" elips şeklinde üzerine geldiğinizde uygulama çökmelerini etkinleştirdiyseniz .

Ben bir TextBox kullanımı hakkında iş parçacığında bahsedilen diğer seçenekleri denedim ama gerçekten 'elips' göstermez ve ayrıca metin içeriğini seçerek kap sığacak kadar uzunsa çözüm gibi görünmüyor metin kutusu bir TextBlock davranışı olmayan dahili olarak 'kayar'.

Bence en iyi çözüm @ torvin cevabı ama elips üzerine geldiğinde kötü bir çökme var.

Güzel olmadığını biliyorum, ancak işlenmeyen istisnalara dahili olarak abone olmak / abonelikten ayrılmak ve istisnayı ele almak, bu sorunu çözmenin tek yoluydu, birisinin daha iyi bir çözümü varsa lütfen paylaşın :)

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;
            }
        }
    }
}

0

Açık kaynak denetimleri kitaplığımda SelectableTextBlock uyguladım . Bu şekilde kullanabilirsiniz:

<jc:SelectableTextBlock Text="Some text" />

4
Bu sadece bir TextBox kullanır, tıpkı yıllar önce gelen diğer birçok cevap gibi.
Chris

-1
Really nice and easy solution, exactly what I wanted !

Bazı küçük değişiklikler getirdim

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;
    }
}

1
Aşağıdaki cevaba göre neleri değiştirdiğinizi açıklamanız gerekiyor. -1
Alex Hope O'Connor

Satır 51 şunu verir: System.ArgumentNullException: 'Değer boş olamaz. Parametre adı: position1 '
rulolar

-1
public MainPage()
{
    this.InitializeComponent();
    ...
    ...
    ...
    //Make Start result text copiable
    TextBlockStatusStart.IsTextSelectionEnabled = true;
}

Bu yukarıdaki gibi cevaplandı .. ve sadece UWP üzerinde çalışır WPF değil
ΩmegaMan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.