HorizontalAlignment = স্ট্রেচ, ম্যাক্সউইথ এবং বাম একই সময়ে সারিবদ্ধ হয়েছে?


96

এটি সহজ হওয়া উচিত বলে মনে হচ্ছে তবে আমি স্টাম্পড। ডাব্লুপিএফ-তে, আমি এমন একটি পাঠ্যবক্স চাই যা এর পিতামাতার প্রস্থে প্রসারিত হয় তবে কেবল সর্বোচ্চ সীমাতে। সমস্যাটি হ'ল আমি চাই এটি এটিকে তার পিতামাতার মধ্যে ন্যায়সঙ্গত রেখে দেওয়া উচিত। এটি প্রসারিত করতে আপনাকে HorizontalAlignment = "স্ট্রেচ" ব্যবহার করতে হবে, তবে তারপরে ফলাফলটি কেন্দ্রিক। আমি হরাইজন্টাল কনটেন্টএলাইনমেন্টের সাথে পরীক্ষা করে দেখেছি, তবে কিছুই করার মনে হচ্ছে না।

আমি কীভাবে উইন্ডোটির আকারের সাথে এই নীল পাঠ্য বাক্সটি বর্ধন করতে, সর্বোচ্চ 200 পিক্সেলের প্রশস্ততা পেতে এবং ন্যায়সঙ্গত বামে রাখতে পারি?

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel>  
    <TextBox Background="Azure" Text="Hello" HorizontalAlignment="Stretch" MaxWidth="200" />
  </StackPanel>
</Page>

কৌশলটি কী?

উত্তর:


89

আপনি HorizontalAlignmentবামে সেট করতে পারেন, সেট করতে পারেন MaxWidthএবং তারপরে মূল উপাদানটির সাথে আবদ্ধ Widthকরতে পারেন ActualWidth:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel Name="Container">   
    <TextBox Background="Azure" 
    Width="{Binding ElementName=Container,Path=ActualWidth}"
    Text="Hello" HorizontalAlignment="Left" MaxWidth="200" />
  </StackPanel>
</Page>

7
অটোরেসাইজ করে না .. সামগ্রীতে উপযুক্ত বলে মনে হচ্ছে .. আমি কি কিছু মিস করছি?
গিশু

এটি আমার
সিলভারলাইট

4
@ গিশু, আপনি উপাদানটি সেট HorizontalAlignment="Stretch"করেছেন তা নিশ্চিত করুন Container । (PS, আমি বুঝতে পারি যে আপনি 6 বছর আগে আপনি এই প্রশ্নটি জিজ্ঞাসা
করেছিলেন

51
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" MaxWidth="200"/>
    </Grid.ColumnDefinitions>

    <TextBox Background="Azure" Text="Hello" />
</Grid>

আমি মনে করি আপনার পাঠ্যবক্সের জন্য ভার্টিক্যালএলাইনমেন্ট = "শীর্ষ" সেট করা দরকার .. ডিফল্টরূপে প্রসারিত বলে মনে হচ্ছে।
গিশু

4
+1 সুন্দর এবং পরিষ্কার। যে কোনও সময় আমি কিছু প্রকৃত প্রস্থকে আবদ্ধ করে (গৃহীত উত্তরের মতো) লেআউটটি পরিচালনা করার চেষ্টা করি, জিনিসগুলি অগোছালো হয়ে যায়।
এরেন এরসনেমেজ

4
আমি ঠিক এই প্রশ্নটি জুড়ে এসেছি যখন একই সমস্যাটি সমাধান করার চেষ্টা করছি। আমার ক্ষেত্রে এটি সেরা উত্তর কারণ এটি উইনআরটি-তে কাজ করে। অন্য উত্তরটি দেয় না কারণ আপনি উইনআরটি-তে প্রকৃতপথের উপর বাঁধাই করতে পারবেন না।
স্লেড

স্লেড - আমি সবেমাত্র একটি উইন্ডোজ স্টোর অ্যাপ্লিকেশনটিতে এটি করেছি: ম্যাক্সউইথ = "{বাইন্ডিং অ্যাকুয়ালউইথ, এলিমেন্টনাম = লেআউট" and আমি নিশ্চিত না কেন এটি আমার পক্ষে কাজ করেছিল তবে এটি আমার প্রত্যাশা মতোই হয়েছিল, এবং উত্তরটির আগে প্রস্থের বাঁধাইয়ের সমাধানটির মতো উল্লেখ করা হয়েছিল, উইন্ডোটি বড় করার কারণে পিতামাতার পুনরায় আকার পরিবর্তন করার সময় বা উপাদানটি পুনরায় আকার দেয়নি বা ছোট
ডেভিড রেক্টর

8

প্রদত্ত দুটি উত্তরই সমস্যার জন্য কাজ করেছে আমি বলেছি - ধন্যবাদ!

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

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


6

আপনি আপনার ডেটা টেম্পলেটটির প্রস্থের জন্য এটি ব্যবহার করতে পারেন:

Width="{Binding ActualWidth,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}"

নিশ্চিত হয়ে নিন যে আপনার ডেটাম্প্লেট রুটে মার্জিন = "0" রয়েছে (আপনি কিছু প্যানেলটিকে রুট হিসাবে ব্যবহার করতে পারেন এবং সেই রুটের শিশুদের জন্য মার্জিন সেট করতে পারেন)


1

গ্রহণযোগ্য উত্তরের মতো কার্যত অনুরূপ, তবে মূল উপাদান নির্দিষ্ট করার প্রয়োজন নেই:

<TextBox
    Width="{Binding ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type FrameworkElement}}}"
    MaxWidth="500"
    HorizontalAlignment="Left" />

1

যারা এখনও এই প্রশ্নে ঝাঁপিয়ে পড়েছেন তাদের আমি এখনও সাহায্য করতে পারি, কারণ এটি খুব পুরানো একটি সমস্যা।

আমারও এটির প্রয়োজন ছিল এবং এটি যত্ন নেওয়ার জন্য একটি আচরণ লিখেছিলাম। সুতরাং এখানে আচরণ:

public class StretchMaxWidthBehavior : Behavior<FrameworkElement>
{        
    protected override void OnAttached()
    {
        base.OnAttached();
        ((FrameworkElement)this.AssociatedObject.Parent).SizeChanged += this.OnSizeChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        ((FrameworkElement)this.AssociatedObject.Parent).SizeChanged -= this.OnSizeChanged;
    }

    private void OnSizeChanged(object sender, SizeChangedEventArgs e)
    {
        this.SetAlignments();
    }

    private void SetAlignments()
    {
        var slot = LayoutInformation.GetLayoutSlot(this.AssociatedObject);
        var newWidth = slot.Width;
        var newHeight = slot.Height;

        if (!double.IsInfinity(this.AssociatedObject.MaxWidth))
        {
            if (this.AssociatedObject.MaxWidth < newWidth)
            {
                this.AssociatedObject.HorizontalAlignment = HorizontalAlignment.Left;
                this.AssociatedObject.Width = this.AssociatedObject.MaxWidth;
            }
            else
            {
                this.AssociatedObject.HorizontalAlignment = HorizontalAlignment.Stretch;
                this.AssociatedObject.Width = double.NaN;
            }
        }

        if (!double.IsInfinity(this.AssociatedObject.MaxHeight))
        {
            if (this.AssociatedObject.MaxHeight < newHeight)
            {
                this.AssociatedObject.VerticalAlignment = VerticalAlignment.Top;
                this.AssociatedObject.Height = this.AssociatedObject.MaxHeight;
            }
            else
            {
                this.AssociatedObject.VerticalAlignment = VerticalAlignment.Stretch;
                this.AssociatedObject.Height = double.NaN;
            }
        }
    }
}

তারপরে আপনি এটির মতো ব্যবহার করতে পারেন:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="0" Text="Label" />
    <TextBox Grid.Column="1" MaxWidth="600">
          <i:Interaction.Behaviors>                       
               <cbh:StretchMaxWidthBehavior/>
          </i:Interaction.Behaviors>
    </TextBox>
</Grid>

এবং অবশেষে System.Windows.Interactivityআচরণটি ব্যবহার করতে নেমস্পেস ব্যবহার করতে ভুলে যাওয়া ।


0

আমি ব্যবহার করব SharedSizeGroup

<Grid>
    <Grid.ColumnDefinition>
        <ColumnDefinition SharedSizeGroup="col1"></ColumnDefinition>  
        <ColumnDefinition SharedSizeGroup="col2"></ColumnDefinition>
    </Grid.ColumnDefinition>
    <TextBox Background="Azure" Text="Hello" Grid.Column="1" MaxWidth="200" />
</Grid>

0

আমার ক্ষেত্রে বাম পাশের টেক্সটবক্সটি প্রসারিত করার জন্য আমাকে একটি স্ট্যাক প্যানেলে পাঠ্যবক্সটি রাখতে হয়েছিল। পূর্ববর্তী পোস্ট ধন্যবাদ। উদাহরণস্বরূপ, উইন্ডোর আকার পরিবর্তন হওয়ার সাথে সাথে কী হয় তা দেখার জন্য আমি একটি পটভূমি রঙ সেট করেছি।

<StackPanel Name="JustContainer" VerticalAlignment="Center" HorizontalAlignment="Stretch" Background="BlueViolet" >
    <TextBox 
       Name="Input" Text="Hello World" 
       MaxWidth="300"
       HorizontalAlignment="Right"
       Width="{Binding ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type FrameworkElement}}}">
    </TextBox>
</StackPanel>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.