आड़ा-तिरछा = खिंचाव, मैक्सविथ और वाम एक ही समय में गठबंधन?


95

ऐसा लगता है कि यह आसान होना चाहिए लेकिन मैं स्टम्प्ड हूं। WPF में, मैं एक टेक्स्टबॉक्स पसंद करूंगा जो इसकी पैरेंट की चौड़ाई तक फैला हो, लेकिन केवल अधिकतम चौड़ाई तक। समस्या यह है कि मैं चाहता हूं कि इसे उसके माता-पिता के भीतर ही छोड़ दिया जाए। इसे फैलाने के लिए आपको क्षैतिज क्षैतिजता = "खिंचाव" का उपयोग करना होगा, लेकिन फिर परिणाम केंद्रित है। मैंने HoroscopeContentAlignment के साथ प्रयोग किया है, लेकिन यह कुछ भी करने के लिए प्रतीत नहीं होता है।

विंडो के आकार के साथ बढ़ने के लिए मुझे यह ब्लू टेक्स्ट बॉक्स कैसे मिलेगा, अधिकतम 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
नहीं करता है ऑटोरेस्पो .. लगता है कि सामग्री के लिए फिट होने के लिए .. मैं कुछ याद कर रहा हूँ?
गिषु ११'०

यह मेरे
सिल्वरलाइट

2
@ Gishu, सुनिश्चित करें कि आपने तत्व HorizontalAlignment="Stretch"पर सेट किया है Container । (पीएस, मुझे लगता है कि आपने 6 साल पहले यह सवाल पूछा था।)
डेविड मर्डोक

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

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

मुझे लगता है कि आपको पाठ बॉक्स के लिए वर्टिकल ऑलिमेंट = "टॉप" सेट करने की आवश्यकता है .. डिफ़ॉल्ट रूप से खिंचाव लगता है।
गिशु

1
+1। अच्छा और साफ। कभी भी मैं कुछ वास्तविक चौड़ाई (जैसा कि स्वीकृत उत्तर में) को बांधकर लेआउट का प्रबंधन करने की कोशिश करता हूं, चीजें गड़बड़ हो जाती हैं।
एरेन एर्सोन्मेज़

1
मैं इस समस्या को हल करने की कोशिश करते हुए सिर्फ इस सवाल पर आया था। मेरे मामले में यह सबसे अच्छा जवाब है क्योंकि यह WinRT में काम करता है। अन्य उत्तर इसलिए नहीं है क्योंकि आप WinRT में एक्चुअलविदथ पर नहीं बाँध सकते।
स्लेड

स्लैड - मैंने अभी यह एक विंडोज स्टोर ऐप में किया था: MaxWidth = "{बाइंडिंग एक्चुअलविदथ, एलिमेंटनेम = लेआउट}" और इसने MaxWidth को अन्य तत्वों के लिए बांधने के लिए ठीक काम किया। मुझे यकीन नहीं है कि यह मेरे लिए क्यों काम करता है लेकिन यह वही करता है जो मुझे उम्मीद थी, और जैसा कि पहले जवाब में बताया गया था कि विधुत बंधन समाधान था, यह तत्व का आकार नहीं बदलता था जब खिड़की को बड़ा बनाने के कारण माता-पिता का आकार बदल जाता था या छोटे।
डेविड रेक्टर

8

दिए गए दोनों उत्तर मैंने बताई गई समस्या के लिए काम किया - धन्यवाद!

हालांकि मेरे असली आवेदन में, मैं एक स्क्रॉल व्यूअर के अंदर एक पैनल को कसने की कोशिश कर रहा था और केंट का तरीका ऐसा नहीं था कि किसी कारण से मैं नीचे ट्रैक करने के लिए परेशान नहीं हुआ। मूल रूप से नियंत्रण मैक्सवार्ड सेटिंग से परे विस्तार कर सकता है और मेरे इरादे को हरा सकता है।

Nir की तकनीक ने अच्छी तरह से काम किया और स्क्रॉलव्यूअर के साथ समस्या नहीं थी, हालांकि देखने के लिए एक मामूली बात है। आप सुनिश्चित करना चाहते हैं कि TextBox पर दाएं और बाएं मार्जिन 0 पर सेट हैं या वे रास्ते में मिलेंगे। वर्टिकल स्क्रॉलबार दिखाई देने पर मुद्दों से बचने के लिए मैंने RealWidth के बजाय ViewportWidth का उपयोग करने के लिए बाइंडिंग बदल दी।


6

आप अपने DataTemplate की चौड़ाई के लिए इसका उपयोग कर सकते हैं:

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

सुनिश्चित करें कि आपके DataTemplate रूट में मार्जिन = "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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.