কোনও ডাব্লুপিএফ পাঠ্যবন্ধকে বাছাইযোগ্য করার উপায়?


224

আমি উইটটিতে প্রদর্শিত পাঠ্যটি একটি ওপেন সোর্স টুইটার ক্লায়েন্টকে চয়নযোগ্য করে তুলতে চাই । এটি বর্তমানে একটি কাস্টম টেক্সটব্লক ব্যবহার করে প্রদর্শিত হয়। আমার একটি টেক্সটব্লক ব্যবহার করা প্রয়োজন কারণ আমি @ ব্যবহারকারীর নাম এবং লিঙ্কগুলিকে হাইপারলিংক হিসাবে প্রদর্শন এবং ফর্ম্যাট করতে পাঠ্য ব্লকের ইনলাইনগুলির সাথে কাজ করছি। ঘন ঘন অনুরোধটি পাঠ্যটি অনুলিপি করতে সক্ষম হবেন। এটি করার জন্য আমাকে টেক্সটব্লকটিকে নির্বাচনযোগ্য করে তোলা দরকার।

আমি পাঠ্যবইয়ের মতো দেখতে কেবল পঠনযোগ্য পাঠ্যবক্স ব্যবহার করে পাঠ্যটি প্রদর্শন করে এটি কাজ করার চেষ্টা করেছি তবে এটি আমার ক্ষেত্রে কাজ করবে না কারণ একটি পাঠ্যবক্সের ইনলাইন নেই। অন্য কথায়, আমি পাঠ্যব্লোকের মতো পাঠ্যবক্সের মতো আলাদাভাবে পাঠ্য শৈলী বা বিন্যাস করতে পারি না।

কোন ধারনা?


1
আমি রিচটেক্সটবক্স নিয়ন্ত্রণ ব্যবহার করে চেষ্টা করব যে এটি কাজ করে কিনা। তবে পূর্ব অভিজ্ঞতা থেকে রিয়েলটেক্সটবক্সে কাজ করা আরও অনেক বেশি জড়িত।
অ্যালান লে

অনুচ্ছেদ এবং রান রয়েছে এমন একটি ফ্লোডোকামেন্ট সহ আপনি কি একটি ফ্লোডোকামেন্টসক্রোলভিউয়ার ব্যবহার করার কথা ভাবেন? - যখন আমার বাছাইযোগ্য পাঠ্যের দরকার হয় তখন এটি আমার পক্ষে বেশ ভাল কাজ করে এবং প্রতিটি অনুচ্ছেদ এবং রান আলাদাভাবে স্টাইল করা যায়।
BrainSlugs83

নীচে কিছু কাজের ক্ষেত্র চেষ্টা করে ফ্লোডোকামেন্টসক্রোলভিউয়ারটি ছিল এগিয়ে যাওয়ার পথ। মনে হচ্ছে এটি রিচটেক্সটবক্স এবং টেক্সটব্লকের মধ্যে একটি কার্যকর মাঝারি স্থল রয়েছে।
টম মাকিন

আপনার প্রয়োজনীয়তার সাথে খাপ খায় এমন কোনও উত্তর গ্রহণের জন্য ডাউন ভোট দিন।
ব্লিচডোজ

উত্তর:


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

6
আমার একটি প্রকল্প রয়েছে যার মধ্যে অনেকগুলি টেক্সটব্লকস / লেবেল রয়েছে, আমি এগুলি সত্যিই পাঠ্যবক্সগুলিতে পরিণত করতে পারি না। আমি যা করতে চাই তা হল অ্যাপ্লিকেশন-স্তরের রিসোর্সে একটি যাদু প্রয়োগ-থেকে-সমস্ত শৈলী যুক্ত করুন যাতে এটি সমস্ত লেবেল / পাঠ্যব্লককে প্রভাবিত করে এবং কেবলমাত্র পাঠ্যবক্স হিসাবে তাদের অভ্যন্তরীণ পাঠ্য উপস্থাপক তৈরি করে, আপনি কি কোনও উপায় সম্পর্কে জানেন? এটা করতে?
শিমি ওয়েইটস্যান্ডলার

5
আপনি IsTabStop যোগ করতে পারেন = "false" আপনার অবস্থা উপর নির্ভর করে
কার্স্টেন

1
+1 খুব সুন্দর সমাধান! আমি একটি প্যাডিং = "0" যুক্ত করেছি, যেহেতু আমার প্রকল্পে পাঠ্যের নীচের অংশটি কাটা হয়েছিল ... সম্ভবত অন্য কোথাও স্টাইলের কারণে।
পুনরায় পোস্ট হয়েছে

123
-1 প্রশ্নটি পাঠ্যবন্ধকে কীভাবে বাছাইযোগ্য করতে হবে তা বিশেষভাবে জিজ্ঞাসা করে। কারণ তিনি "ইনলাইনস" সম্পত্তি (যা পাঠ্যবক্সগুলিতে নেই) হারাতে চান না। এই 'উত্তর' কেবল একটি পাঠ্যবাক্সকে একটি পাঠ্যরূপের মতো দেখানোর পরামর্শ দিচ্ছে।
00jt

19
@ অ্যালানলে আপনি এই উত্তরটি কেন গ্রহণ করলেন যখন আপনি স্পষ্টভাবে বলেছিলেন যে আপনি চান না? এবং কেন 147 জন নিরীহ মানুষ এটিকে উত্সাহিত করেছিল?
জিম বাল্টার

66

এখানে সমস্ত উত্তর কেবলমাত্র একটি ব্যবহার করে TextBoxবা ম্যানুয়ালি পাঠ্য নির্বাচন প্রয়োগ করার চেষ্টা করছে যা খারাপ কর্মক্ষমতা বা অ-নেটিভ আচরণের দিকে পরিচালিত করে (ঝলকানো ক্যারেটেTextBox , ম্যানুয়াল বাস্তবায়নে কোনও কীবোর্ড সমর্থন ইত্যাদি) দিকে পরিচালিত করে না)

ঘণ্টার পর ঘণ্টা এবং ডাব্লুপিএফ উত্স কোড পড়ার পরে , পরিবর্তে আমি TextBlockনিয়ন্ত্রণের (বা অন্য কোনও নিয়ন্ত্রণের) জন্য স্থানীয় ডাব্লুপিএফ পাঠ্য নির্বাচন সক্ষম করার একটি উপায় আবিষ্কার করেছি । পাঠ্য নির্বাচনের প্রায়শই বেশিরভাগ কার্যকারিতা System.Windows.Documents.TextEditorসিস্টেম শ্রেণিতে প্রয়োগ করা হয় ।

আপনার নিয়ন্ত্রণের জন্য পাঠ্য নির্বাচন সক্ষম করতে আপনার দুটি জিনিস করতে হবে:

  1. TextEditor.RegisterCommandHandlers()ক্লাস ইভেন্ট হ্যান্ডলারদের রেজিস্টার করতে একবার কল করুন

  2. এর একটি দৃষ্টান্ত তৈরি করুন TextEditorআপনার বর্গ প্রতিটি নিদর্শনের জন্য এবং আপনার অন্তর্নিহিত উদাহরণস্বরূপ পাস System.Windows.Documents.ITextContainerএটি

আপনার নিয়ন্ত্রণের Focusableসম্পত্তি সেট করা আছে এমন একটি প্রয়োজনীয়তাও রয়েছে True

এই হল! সহজ মনে হচ্ছে, তবে দুর্ভাগ্যক্রমে TextEditorশ্রেণিটি অভ্যন্তরীণ হিসাবে চিহ্নিত হয়েছে। সুতরাং এর চারপাশে আমাকে একটি প্রতিবিম্ব র‌্যাপার লিখতে হয়েছিল:

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

আমি এটি SelectableTextBlockথেকে উদ্ভূত একটি উত্সও তৈরি করেছি যা 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);
    }
}

আর একটি বিকল্প হ'ল TextBlockচাহিদা অনুসারে পাঠ্য নির্বাচন সক্ষম করার জন্য একটি সংযুক্ত সম্পত্তি তৈরি করা । এই ক্ষেত্রে, নির্বাচনটি আবার নিষ্ক্রিয় করতে, এই কোডটির TextEditorপ্রতিবিম্ব সমতুল্য ব্যবহার করে একজনকে আলাদা করতে হবে :

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

1
আপনি যে কোনও এক্সএএমএল থাকা উচিত তা আপনি কীভাবে সিলেকটেবল টেক্সটব্লক ক্লাসটি ব্যবহার করবেন?
Yoav Feuerstein

1
একইভাবে আপনি অন্য কোনও কাস্টম নিয়ন্ত্রণ ব্যবহার করবেন। দেখতে stackoverflow.com/a/3768178/332528 উদাহরণস্বরূপ
torvin

3
@ বিলিউইলবুবির আপনার সমাধানটি কেবল নির্বাচনের অনুকরণ করে। এতে অনেকগুলি দেশীয় নির্বাচনের বৈশিষ্ট্য নেই: কীবোর্ড সমর্থন, প্রসঙ্গ মেনু ইত্যাদি My আমার সমাধান দেশীয় নির্বাচন বৈশিষ্ট্যটি সক্ষম করে
টরভিন

3
এটা যে এই সমাধান বলে মনে হয় না যখন কাজ TextBlockএমবেডেড হয়েছে Hyperlinkগুলি যতদিন Hyperlinkএটা গত ইনলাইন নয়। একটি খালি trailing যোগ করার পদ্ধতি Runবিষয়বস্তু সংশোধন করা হয়েছে যাই হোক না কেন অন্তর্নিহিত সমস্যা যা ফলাফল হয় ExecutionEngineExceptionনিক্ষিপ্ত হচ্ছে।
আন্তন টিখ্য

2
এটা অসাধারণ! যদি আপনার কাছে TextTrimming="CharacterEllipsis"থাকে TextBlockএবং উপলব্ধ প্রস্থটি অপর্যাপ্ত হয় তবে আপনি যদি মাউস পয়েন্টারটিকে… এর উপরে সরান, তবে এটি সিস্টেমের সাথে ক্র্যাশ হয়ে যায় r System.Windows.Documents.TextPointer.InitializeOffset (টেক্সটপয়েন্টার অবস্থান, Int32 দূরত্ব, লজিকাল ডাইরেকশন দিক) :( টেক্সটট্রাইমিংয়ের কোনওটিতে না রেখে অন্য কোনও কাজ আছে কিনা তা জানেন না।
ডেভ হুয়াং

32

আমি সত্যিই প্রশ্নের উত্তর দেওয়ার কোনও উদাহরণ খুঁজে পাচ্ছি না। সমস্ত উত্তর একটি পাঠ্যবক্স বা রিচটেক্সটবক্স ব্যবহার করেছে। আমার এমন একটি সমাধানের প্রয়োজন ছিল যা আমাকে একটি টেক্সটলক ব্যবহার করতে দেয় এবং এটিই আমার তৈরি সমাধান।

আমি বিশ্বাস করি এটি করার সঠিক উপায়টি টেক্সটব্লক ক্লাসটি প্রসারিত করা। আমাকে পাঠ্যটি নির্বাচন করতে এবং ক্লিপবোর্ডে অনুলিপি করার জন্য টেক্সটব্লক ক্লাসটি প্রসারিত করার জন্য এটি কোডটিই আমি ব্যবহার করেছি। "sdo" হ'ল আমি ডাব্লুপিএফ-তে ব্যবহৃত স্থানের রেফারেন্স।

ডাব্লুপিএফ বর্ধিত শ্রেণি ব্যবহার করে:

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

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত! কোনও প্রতিবিম্ব হ্যাক নেই, একটি টেক্সটবক্স ব্যবহার করা হচ্ছে না ... এবং এটি সহজেই পুনরায় ব্যবহারযোগ্য আচরণে রিফ্যাক্টর করা যেতে পারে। খুব সুন্দর ধন্যবাদ!
টমাস লেভেস্ক

19

আপনার টেক্সটবক্সে এই স্টাইলটি প্রয়োগ করুন এবং এটিই (অনুপ্রেরণা থেকে অনুপ্রাণিত) এই নিবন্ধ ):

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


2
আরেকটি সংযোজন: প্যাডিং -2,0, -2,0 হওয়া উচিত। টেক্সটবক্সের অভ্যন্তরে একটি পাঠ্যবক্সভিউ নিয়ন্ত্রণ তৈরি করা হয়েছে যার ডিফল্ট মার্জিন 2,0,2,0 রয়েছে। দুর্ভাগ্যক্রমে, আপনি এর স্টাইলটি পুনরায় সংজ্ঞায়িত করতে পারবেন না কারণ এটি অভ্যন্তরীণ হিসাবে চিহ্নিত রয়েছে।
fdub

11
কেউ পড়তে পারছে বলে মনে হয় না। ওপিকে টেক্সটব্লকের মতো স্টাইলযুক্ত টেক্সটবক্সের দরকার নেই B
জিম বাল্টার

18

টেক্সটব্লকের জন্য কন্ট্রোলটেম্পলেট তৈরি করুন এবং কেবল পাঠযোগ্য সম্পত্তি সেট সহ একটি পাঠ্যবক্সটি ভিতরে রাখুন। অথবা কেবল টেক্সটবক্স ব্যবহার করুন এবং এটিকে কেবল পঠনযোগ্য করে তুলুন, তারপরে আপনি টেক্সটব্লকের মতো দেখতে টেক্সটবক্স.স্টাইল পরিবর্তন করতে পারেন।


11
আপনি টেক্সটব্লকের জন্য কন্ট্রোলটেম্পলেটটি কীভাবে সেট করবেন? আমি সম্পত্তি খুঁজে পাচ্ছি না?
হ্যাক্সলিট

18
আপনার টেক্সটব্লকের মধ্যে যদি ইনলাইন উপাদান থাকে তবে এই পদ্ধতিটি কাজ করবে না। আপনি যদি হাইপারলিংক পেয়েছেন বা সাহসী বা ইটালিক পাঠ্যের রানগুলি পেয়েছেন? পাঠ্যবক্স এগুলি সমর্থন করে না।
dthrasher

1
আপনি যদি ইনলাইন রান ব্যবহার করছেন এবং হ্যাক্সলিট যেমন জিজ্ঞাসা করেছেন, কাজ করে না তবে আপনি নিয়ন্ত্রণ টেম্পলেটটি বলতে চাইছেন তা নিশ্চিত নই।
রিচ মেল্টন

7
-1 টেক্সটব্লকের একটি কন্ট্রোলটেম্পলেট নেই কারণ এটি ফ্রেমওয়ার্ক এলিমেন্টের প্রত্যক্ষ সাবক্লাস। অন্যদিকে টেক্সটবক্স নিয়ন্ত্রণের একটি সাবক্লাস।
পুনরায় পোস্ট করুন

5
কেউ কেন পড়তে পারে না? ওপি স্পষ্টতই বলেছে একটি টেক্সটব্লক দরকার টেক্সটবক্স নয়, কারণ টেক্সটব্লক ইনলাইন বিন্যাস সমর্থন করে এবং টেক্সটবক্স তা দেয় না। কেন এইরকম সম্পূর্ণরূপে ভুল জঞ্জাল উত্তরগুলি অসংখ্য উত্স পাবে?
জিম বাল্টার

10

আমি নিশ্চিত নই যে আপনি কোনও টেক্সটলককে বাছাইযোগ্য করে তুলতে পারেন কিনা তবে অন্য একটি বিকল্প হ'ল রিচটেক্সটবক্স ব্যবহার করা - এটি যেমন আপনি প্রস্তাব করেছিলেন তেমন একটি টেক্সটবক্সের মতো, তবে আপনি যে ফর্ম্যাটটি চান তা সমর্থন করে।


1
আমি এটি করার চেষ্টা করেছি এবং প্রক্রিয়াতে রিচটেক্সটবক্সকে নির্ভরতার সম্পত্তি সহ বাইন্ডেবল করতে হয়েছিল। দুর্ভাগ্যক্রমে পুরানো ফ্লোডোকমেন্টগুলি সঠিকভাবে বাতিল করা হচ্ছে না এবং মেমরিটি পাগলের মতো ফাঁস হচ্ছে। অ্যালান, আমি অবাক হয়েছি আপনি যদি এর আশেপাশে কোনও উপায় খুঁজে পান?
জন নুনন

@ অ্যালান এখানে সমস্ত প্রতিক্রিয়াগুলির মধ্যে, এটি দুটির মধ্যে একটি যা আসলে জিজ্ঞাসিত প্রশ্নের উত্তর দেয় ... অন্য সমস্ত ফর্ম্যাট করার প্রয়োজনীয়তা উপেক্ষা করার সময়, টেক্সটব্লকের মতো দেখতে একটি পাঠ্যবক্সকে স্টাইলিং করার বিষয়ে কথা বলেন। এটি উদ্ভট এবং দুর্ভাগ্যজনক যে, টেক্সটবক্সের পরিবর্তে রিচটেক্সটবক্স ব্যবহারের সঠিক উত্তরের পরিবর্তে ওপি সেই সমস্ত অ-উত্তরগুলির মধ্যে একটি গ্রহণ করেছে।
জিম বাল্টার

9

উইন্ডোজ ডেভ সেন্টার অনুসারে :

পাঠ্যব্লক.আইসেক্সটেক্সটলেশন সক্ষম করা সম্পত্তি

[উইন্ডোজ ১০. ইউডাব্লুপি অ্যাপসের জন্য আপডেট করা হয়েছে উইন্ডোজ ৮.x প্রবন্ধের জন্য, সংরক্ষণাগারটি দেখুন ]

এমন কোনও মূল্য পান বা সেট করে যা ব্যবহারকারী কর্মের মাধ্যমে বা নির্বাচন-সম্পর্কিত এপিআইয়ের কল করার মাধ্যমে পাঠ্যব্লকটিতে পাঠ্য নির্বাচন সক্ষম কিনা তা নির্দেশ করে ।


5
দুর্ভাগ্যক্রমে, উইন 7 এর সাথে সামঞ্জস্যপূর্ণ নয় (কখনও কখনও এটি একটি আবশ্যকীয় প্রয়োজন)
ইউরি শকাতুলা

24
আমসওয়ারটি ভুল বলে মনে হচ্ছে। #TextSelectionEnabled শুধুমাত্র ইউডাব্লুপি-র জন্য, ডাব্লুপিএফ নয় - মূল প্রশ্নটি ডাব্লুপিএফ নির্দিষ্ট করেছে specify
পফিন

6

যদিও প্রশ্নটি 'নির্বাচনযোগ্য' বলেছে আমি বিশ্বাস করি ইচ্ছাকৃত ফলাফলগুলি ক্লিপবোর্ডে পাঠ্যটি পেতে। ক্লিপবোর্ডে টেক্সটব্লক পাঠ্য সম্পত্তিটির মান রাখে এমন একটি প্রসঙ্গে মেনু এবং মেনু আইটেম যুক্ত করে এটি সহজে এবং মার্জিতভাবে অর্জন করা যেতে পারে। যাইহোক ঠিক একটি ধারণা।


4

টেক্সটব্লকের কোনও টেম্পলেট নেই। সুতরাং এটি অর্জনের জন্য, আমাদের একটি পাঠ্যবক্স ব্যবহার করতে হবে যার পাঠ্যব্লক হিসাবে আচরণ করার জন্য স্টাইলটি পরিবর্তিত হয়েছে।

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

অন্যান্য উত্তরগুলির সাথে তুলনায় এই পদ্ধতির কী সুবিধা রয়েছে? আমি কিছুই দেখতে পাচ্ছি না।
শে

আমি এই স্টাইলটি চেষ্টা করেছি: টেক্সটবক্সবারর্ডার সংজ্ঞায়িত করা হয়নি। আপনি যদি এটি মন্তব্য করেন তবে এটি দুর্দান্ত কাজ করে
স্টাইয়ার্স

এই উদাহরণ কোডটি দুর্দান্ত, এটি টেক্সটব্লকের জন্য কীভাবে ডিফল্ট রঙ পাবেন তা দেখায়।
কনটাঙ্গো

1
এটি বেশ বিভ্রান্ত। প্রথমে x: কী, "টেক্সটব্লকউসিংটেক্সটবক্সস্টাইল" পিছনের দিকে; এটি "TextBoxUsingTextBlockStyle" হওয়া উচিত। দ্বিতীয়ত, ওপি ইতিমধ্যে টেক্সটব্লকের মতো কোনও পাঠ্যবক্সকে কীভাবে স্টাইল করতে হবে তা জানত, তবে বারবার বলেছিলেন যে বিন্যাসের জন্য ইনলাইনগুলির প্রয়োজন হওয়ায় তিনি তা ব্যবহার করতে পারেন না।
জিম বাল্টার

2

একটি বিকল্প সমাধান রয়েছে যা এই ব্লগ পোস্টে রিচটেক্সটবক্সের সাথে খাপ খাইয়ে নিতে পারে - যখন এটি নিয়ন্ত্রণের উপরে ব্যবহারের নিয়ন্ত্রণে আসে তখন এটি ট্রিগার ব্যবহার করে - কার্য সম্পাদনে সহায়তা করা উচিত


1
আপনার লিঙ্কটি মারা গেছে। দয়া করে উত্তরের মধ্যে সমস্ত সম্পর্কিত তথ্য অন্তর্ভুক্ত করুন এবং লিঙ্কগুলি কেবল উদ্ধৃতি হিসাবে ব্যবহার করুন।
জিম বাল্টার

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
এটি সহায়ক নয়। ওপি আসলে কী চায় তা দেখতে প্রশ্নটি পড়ুন।
জিম বাল্টার

1

@ টরভিনের উত্তরে যুক্ত করা এবং @ ডেভ হুয়াং মন্তব্যগুলিতে উল্লেখ করেছেন যদি আপনার কাছে থাকে TextTrimming="CharacterEllipsis" উপবৃত্তের উপর দিয়ে সময় অ্যাপ্লিকেশন ক্র্যাশ করতে সক্ষম হয়ে থাকেন।

আমি টেক্সটবক্স ব্যবহারের বিষয়ে থ্রেডে উল্লিখিত অন্যান্য বিকল্পগুলি চেষ্টা করেছিলাম তবে এটি 'এলিপসিস' প্রদর্শন করে না এবং এটি পাঠ্যটির বিষয়বস্তু নির্বাচন করে ধারকটি ফিট করার ক্ষেত্রে পাঠ্য দীর্ঘায়িত হওয়ার ক্ষেত্রে এটি সমাধান বলে মনে হচ্ছে না really অভ্যন্তরীণভাবে পাঠ্যবাক্সটি 'স্ক্রোলস' যা কোনও পাঠ্যব্লক আচরণ নয়।

আমি মনে করি সেরা সমাধানটি @ টরভিনের উত্তর তবে উপবৃত্তের উপরে ঘুরে বেড়ানোর সময় বাজে ক্র্যাশ হয়েছে।

আমি জানি এটি সুন্দর নয়, তবে আনহ্যান্ডেল ব্যতিক্রমগুলিতে অভ্যন্তরীণভাবে সাবস্ক্রাইব / সাবস্ক্রাইব করা এবং ব্যতিক্রমটি পরিচালনা করা এই সমস্যাটি সমাধান করার আমি খুঁজে পেলাম, দয়া করে কারোর আরও ভাল সমাধান থাকলে অবশ্যই শেয়ার করুন :)

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

আমি আমার ওপেনসোর্স নিয়ন্ত্রণ লাইব্রেরিতে সিলেটেবল টেক্সটব্লক প্রয়োগ করেছি । আপনি এটি এর মতো ব্যবহার করতে পারেন:

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

4
এটি কেবল একটি টেক্সটবক্স ব্যবহার করে, যেমন বহু বছর আগে থেকে অন্যান্য অনেক উত্তর।
ক্রিস


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

আমি কিছু ছোট পরিবর্তন আনা

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
দয়া করে নীচের উত্তর থেকে আপনি কী পরিবর্তন করেছেন তা ব্যাখ্যা করা দরকার। -1
অ্যালেক্স হোপ ও'কনর

লাইন ৫১ দেয়: সিস্টেম.আরগমেন্ট নাল এক্সেক্সপশন: 'মান শূন্য হতে পারে না। প্যারামিটারের নাম: অবস্থান 1 '
রোল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.