أي طريقة لجعل textBlock WPF للتحديد؟


5 Answers

لم أتمكن من العثور على أي مثال للإجابة على السؤال. استخدمت كل الإجابات Textbox أو RichTextbox. احتجت إلى حل سمح لي باستخدام TextBlock ، وهذا هو الحل الذي أنشأته.

أعتقد أن الطريقة الصحيحة للقيام بذلك هي توسيع فئة TextBlock. هذا هو الرمز الذي استخدمته لتمديد فئة TextBlock للسماح لي بتحديد النص ونسخه إلى الحافظة. "sdo" هو مرجع مساحة الاسم المستخدمة في WPF.

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>

رمز خلف للفئة الموسعة:

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

رمز نافذة المثال:

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

أرغب في جعل النص معروضًا في Witty ، عميل Twitter مفتوح المصدر ، يمكن اختياره. يتم عرضه حاليًا باستخدام نص مخصّص. أحتاج إلى استخدام TextBlock لأنني أعمل مع مضمون النص في عرض وتنسيق @ اسم المستخدم والروابط على شكل روابط تشعبية. طلب متكرر هو أن تتمكن من نسخ ولصق النص. من أجل القيام بذلك ، أحتاج إلى جعل TextBlock قابل للتحديد.

حاولت الحصول عليه للعمل عن طريق عرض النص باستخدام TextBox للقراءة فقط نصبها لتبدو وكأنها textblock ولكن هذا لن يعمل في حالتي لأنه ليس لديه TextBox مضمنة. بمعنى آخر ، لا يمكنني تنسيق أو تنسيق النص داخل TextBox بشكل فردي كما يمكنني باستخدام TextBlock.

أيه أفكار؟




إنشاء ControlTemplate لـ TextBlock ووضع مربع نص داخل مع مجموعة خصائص للقراءة فقط. أو مجرد استخدام TextBox وجعله readonly ، ثم يمكنك تغيير TextBox.Style لجعله يبدو مثل TextBlock.




لقد قمت بتنفيذ SelectableTextBlock في مكتبة عناصر التحكم في المصدر. يمكنك استخدامه على النحو التالي:

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



في حين أن السؤال يقول "اختيار" أعتقد أن النتائج المقصودة هي الحصول على النص إلى الحافظة. ويمكن تحقيق ذلك بسهولة وبأناقة عن طريق إضافة قائمة سياق وعناصر قائمة تسمى النسخة التي تضع قيمة الخاصية Textblock Text في الحافظة. مجرد فكرة على أي حال.




لست متأكدًا مما إذا كان يمكنك جعل TextBlock قابلاً للتحديد ، لكن هناك خيار آخر هو استخدام RichTextBox - فهو مثل TextBox كما اقترحت ، ولكنه يدعم التنسيق الذي تريده.




لا يحتوي TextBlock على قالب. لذا حتى نتحقق من ذلك ، نحتاج إلى استخدام TextBox الذي تم تغيير نمطه ليتصرف كنص.

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



Related