ডাব্লুপিএফ পাঠ্যব্লকটিতে স্বয়ংক্রিয় উল্লম্ব স্ক্রোল বার?


335

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

আমি TextBlockযখন এর বিষয়বস্তুগুলির উচ্চতা ছাড়িয়ে গেলে স্বয়ংক্রিয়ভাবে তৈরি উল্লম্ব স্ক্রোল বারটি কীভাবে তৈরি করতে পারি ?

স্পষ্টকরণ: আমি বরং এটি এক্সএএমএলকে সরাসরি লিখে না করে ডিজাইনারের কাছ থেকে করব।


1
এই প্রশ্নটি পুনরায় পড়ার পরে, আমি লক্ষ্য করেছি যে আপনি TextBlockদুবার এবং TextBoxএকবার উল্লেখ করেছেন ।
ড্রয় নোকস

উত্তর:


555

এটিকে কোনও স্ক্রোল দর্শনে মুড়িয়ে দিন:

<ScrollViewer>
    <TextBlock />
</ScrollViewer>

দ্রষ্টব্য, উত্তরটি TextBlockমূল প্রশ্নের মধ্যে যেমনটি জিজ্ঞাসা করা হয়েছে (কেবল পঠনযোগ্য পাঠ্যের উপাদান) এর ক্ষেত্রে প্রযোজ্য ।

আপনি যদি কোনও TextBox(সম্পাদনযোগ্য পাঠ্য উপাদান) স্ক্রোল বারগুলি দেখাতে চান তবে ScrollViewerসংযুক্ত বৈশিষ্ট্যগুলি ব্যবহার করুন :

<TextBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         ScrollViewer.VerticalScrollBarVisibility="Auto" />

এই দুটি বৈশিষ্ট্যের জন্য বৈধ মান হল Disabled, Auto, Hiddenএবং Visible


2
আমি ডিজাইনারের কাছ থেকে এটি কীভাবে করব?
বাব যোগো

16
দুঃখিত আমি নিশ্চিত নই, আমি ডাব্লুপিএফ ডিজাইনার ব্যবহার করি না। আমি মনে করি আপনি যদি সরাসরি এক্সএএমএল যোগ করেন তবে ডিজাইনার নিজেই আপডেট হবে।
ড্রয় নোকস

5
@ কনকনেটর টেক্সটবক্স.স্রোকল টোইন্ড ();
পেটি বি

2
@ গ্রেগ, প্রশ্নটি সম্পর্কে TextBlockনয় TextBox
ড্রয় নোকস

7
কখনও কখনও স্ক্রোলভিউরের উপর একটি ম্যাক্সহাইটের প্রয়োজন হয় যদি ঘেরযুক্ত উপাদানটি কোনও উচ্চতা প্রয়োগ না করে তবে স্কোলটি উপস্থিত হতে বাধ্য করতে হবে।
হ্যাকার বালু

106

নিম্নলিখিত এখন ব্যবহার করতে পারেন:

<TextBox Name="myTextBox" 
         ScrollViewer.HorizontalScrollBarVisibility="Auto"
         ScrollViewer.VerticalScrollBarVisibility="Auto"
         ScrollViewer.CanContentScroll="True">SOME TEXT
</TextBox>

19
@jjnguy, আমি সম্পর্কে হচ্ছে মূল প্রশ্ন ব্যাখ্যা TextBlockনা TextBox(শিরোনাম এবং খোলা লাইন হিসেবে), কিন্তু দ্বিতীয় অনুচ্ছেদ উল্লেখ TextBox। স্পষ্টতই, এই উত্তরটি অবশ্যই পাঠ্য বাক্সগুলির জন্য সেরা পদ্ধতির এবং আমার পাঠ্য ব্লকগুলির জন্য আমি সবচেয়ে ভাল জানি :)
ড্রু নোকস

@ ড্র, আহ, তা বোঝায়। স্পষ্টতার জন্য ধন্যবাদ।
jjnguy

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

20

এর থেকে আরও ভাল কিছু হবে:

<Grid Width="Your-specified-value" >
    <ScrollViewer>
         <TextBlock Width="Auto" TextWrapping="Wrap" />
    </ScrollViewer>
</Grid>

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


7
<ScrollViewer Height="239" VerticalScrollBarVisibility="Auto">
    <TextBox AcceptsReturn="True" TextWrapping="Wrap" LineHeight="10" />
</ScrollViewer>

এটি এক্সএএমএল-তে স্ক্রোলিং টেক্সটবক্স ব্যবহার করার এবং এটি একটি পাঠ্য অঞ্চল হিসাবে ব্যবহার করার উপায়।


1
প্রশ্ন সম্পর্কিত TextBlockনয় TextBox
আফজাল আহমদ জিশান

পুরোপুরি সঠিক উত্তর নয়, তবে আমি উল্লম্বস্ক্রোলবারভিসিবিলিটি একটি দরকারী ইঙ্গিত হিসাবে খুঁজে পেয়েছি সুতরাং +1
মালাচি

4

এই উত্তরটি এমভিভিএম ব্যবহার করে একটি সমাধান বর্ণনা করে।

আপনি যদি একটি উইন্ডোতে লগিং বাক্স যুক্ত করতে চান তবে এই সমাধানটি দুর্দান্ত। যা প্রতিবার নতুন লগিং বার্তা যুক্ত হওয়ার পরে স্বয়ংক্রিয়ভাবে নীচে স্ক্রোল করে।

এই সংযুক্ত বৈশিষ্ট্যগুলি যুক্ত হয়ে গেলে সেগুলি যে কোনও জায়গায় পুনরায় ব্যবহার করা যায়, সুতরাং এটি খুব মডুলার এবং পুনরায় ব্যবহারযোগ্য সফ্টওয়্যার তৈরি করে।

এই এক্সএএমএল যুক্ত করুন:

<TextBox IsReadOnly="True"   
         Foreground="Gainsboro"                           
         FontSize="13" 
         ScrollViewer.HorizontalScrollBarVisibility="Auto"
         ScrollViewer.VerticalScrollBarVisibility="Auto"
         ScrollViewer.CanContentScroll="True"
         attachedBehaviors:TextBoxApppendBehaviors.AppendText="{Binding LogBoxViewModel.AttachedPropertyAppend}"                                       
         attachedBehaviors:TextBoxClearBehavior.TextBoxClear="{Binding LogBoxViewModel.AttachedPropertyClear}"                                    
         TextWrapping="Wrap">

এই সংযুক্ত সম্পত্তি যুক্ত করুন:

public static class TextBoxApppendBehaviors
{
    #region AppendText Attached Property
    public static readonly DependencyProperty AppendTextProperty =
        DependencyProperty.RegisterAttached(
            "AppendText",
            typeof (string),
            typeof (TextBoxApppendBehaviors),
            new UIPropertyMetadata(null, OnAppendTextChanged));

    public static string GetAppendText(TextBox textBox)
    {
        return (string)textBox.GetValue(AppendTextProperty);
    }

    public static void SetAppendText(
        TextBox textBox,
        string value)
    {
        textBox.SetValue(AppendTextProperty, value);
    }

    private static void OnAppendTextChanged(
        DependencyObject d,
        DependencyPropertyChangedEventArgs args)
    {
        if (args.NewValue == null)
        {
            return;
        }

        string toAppend = args.NewValue.ToString();

        if (toAppend == "")
        {
            return;
        }

        TextBox textBox = d as TextBox;
        textBox?.AppendText(toAppend);
        textBox?.ScrollToEnd();
    }
    #endregion
}

এবং এই সংযুক্ত সম্পত্তি (বাক্সটি সাফ করার জন্য):

public static class TextBoxClearBehavior
{
    public static readonly DependencyProperty TextBoxClearProperty =
        DependencyProperty.RegisterAttached(
            "TextBoxClear",
            typeof(bool),
            typeof(TextBoxClearBehavior),
            new UIPropertyMetadata(false, OnTextBoxClearPropertyChanged));

    public static bool GetTextBoxClear(DependencyObject obj)
    {
        return (bool)obj.GetValue(TextBoxClearProperty);
    }

    public static void SetTextBoxClear(DependencyObject obj, bool value)
    {
        obj.SetValue(TextBoxClearProperty, value);
    }

    private static void OnTextBoxClearPropertyChanged(
        DependencyObject d,
        DependencyPropertyChangedEventArgs args)
    {
        if ((bool)args.NewValue == false)
        {
            return;
        }

        var textBox = (TextBox)d;
        textBox?.Clear();
    }
}   

তারপরে, আপনি যদি এমইএফ এর মতো নির্ভরতা ইনজেকশন কাঠামো ব্যবহার করেন, আপনি লগিং-নির্দিষ্ট কোডের সমস্তটি তার নিজস্ব ভিউমোডেলটিতে রাখতে পারেন:

public interface ILogBoxViewModel
{
    void CmdAppend(string toAppend);
    void CmdClear();

    bool AttachedPropertyClear { get; set; }

    string AttachedPropertyAppend { get; set; }
}

[Export(typeof(ILogBoxViewModel))]
public class LogBoxViewModel : ILogBoxViewModel, INotifyPropertyChanged
{
    private readonly ILog _log = LogManager.GetLogger<LogBoxViewModel>();

    private bool _attachedPropertyClear;
    private string _attachedPropertyAppend;

    public void CmdAppend(string toAppend)
    {
        string toLog = $"{DateTime.Now:HH:mm:ss} - {toAppend}\n";

        // Attached properties only fire on a change. This means it will still work if we publish the same message twice.
        AttachedPropertyAppend = "";
        AttachedPropertyAppend = toLog;

        _log.Info($"Appended to log box: {toAppend}.");
    }

    public void CmdClear()
    {
        AttachedPropertyClear = false;
        AttachedPropertyClear = true;

        _log.Info($"Cleared the GUI log box.");
    }

    public bool AttachedPropertyClear
    {
        get { return _attachedPropertyClear; }
        set { _attachedPropertyClear = value; OnPropertyChanged(); }
    }

    public string AttachedPropertyAppend
    {
        get { return _attachedPropertyAppend; }
        set { _attachedPropertyAppend = value; OnPropertyChanged(); }
    }

    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}

এখানে কিভাবে এটা কাজ করে:

  • ভিউমোডেল টেক্সটবক্সকে নিয়ন্ত্রণ করতে সংযুক্ত বৈশিষ্ট্যগুলিকে টগল করে।
  • এটি "সংযোজন" ব্যবহার করে, এটি দ্রুত বজ্রপাত হয়।
  • অন্য যে কোনও ভিউমোডেল লগিং ভিউমোডেলে পদ্ধতিতে কল করে লগিং বার্তা উত্পন্ন করতে পারে।
  • আমরা যেমন টেক্সটবক্সে নির্মিত স্ক্রোলভিউয়ারটি ব্যবহার করি, প্রতিবার নতুন বার্তা যুক্ত হওয়ার পরে আমরা এটিকে স্বয়ংক্রিয়ভাবে পাঠ্যবক্সের নীচে স্ক্রোল করতে পারি।

4
<ScrollViewer MaxHeight="50"  
              Width="Auto" 
              HorizontalScrollBarVisibility="Disabled"
              VerticalScrollBarVisibility="Auto">
     <TextBlock Text="{Binding Path=}" 
                Style="{StaticResource TextStyle_Data}" 
                TextWrapping="Wrap" />
</ScrollViewer>

আমি স্ক্রোলভিউয়ারে ম্যাক্সহাইট রেখে অন্যভাবে এটি করছি।

টেক্সটের আরও কম সংখ্যক লাইন দেখাতে কেবল ম্যাকহাইট সামঞ্জস্য করুন। সহজ।



1

আমি এই পরামর্শগুলি একটি পাঠ্যরূপের জন্য কাজ করার চেষ্টা করেছি, কিন্তু এটি কাজ করতে পারিনি। এমনকি এটি ডিজাইনারের কাছ থেকে কাজ করার চেষ্টা করেছি। (লেআউট অল্পক্ষণের এবং নিচের তীর চিহ্ন "v" নীচে ক্লিক করে তালিকা প্রসারিত) আমি scrollviewer সেটিং চেষ্টা দৃশ্যমান এবং তারপর অটো , কিন্তু এটি এখনও কাজ করবে না।

আমি অবশেষে হাল ছেড়ে দেননি এবং পরিবর্তিত TextBlockএকটি থেকে TextBoxসঙ্গে শুধুমাত্র পঠনযোগ্য অ্যাট্রিবিউট সেট, এবং এটি একটি যাদুমন্ত্র মত কাজ করেন।


0

জানি না অন্য কেউ এই সমস্যা রয়েছে কিন্তু যদি আমার মোড়কে TextBlockএকটি মধ্যে ScrollViewersomewhow আমার UI 'তে বিশৃঙ্খলার সৃষ্টি - যেমন একটি সহজ কার্যসংক্রান্ত আমি মূর্ত আউট যে প্রতিস্থাপন TextBlockএকটি দ্বারা TextBoxএই এক মত

<TextBox  Name="textBlock" SelectionBrush="Transparent" Cursor="Arrow" IsReadOnly="True" Text="My Text" VerticalScrollBarVisibility="Auto">

এমন একটি তৈরি করে TextBoxযা দেখতে এবং দেখতে TextBlockকোনও স্ক্রোলবারের মতো আচরণ করে (এবং আপনি এটি ডিজাইনারের মধ্যেও করতে পারেন)।


0

এটি এই প্রশ্নের একটি সহজ সমাধান। উল্লম্ব স্ক্রোলটি তখনই সক্রিয় করা হবে যখন পাঠ্যটি উপচে পড়বে।

<TextBox Text="Try typing some text here " ScrollViewer.VerticalScrollBarVisibility="Auto" TextWrapping="WrapWithOverflow" />

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