WPF TextBox StackPanel में नहीं भरेगा


94

मेरे पास एक TextBoxनियंत्रण है StackPanelजिसके Orientationलिए सेट किया गया है Horizontal, लेकिन शेष StackPanel स्थान को भरने के लिए TextBox प्राप्त नहीं कर सकता है।

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="180" Width="324">

    <StackPanel Background="Orange" Orientation="Horizontal" >
        <TextBlock Text="a label" Margin="5" VerticalAlignment="Center"/>
        <TextBox Height="25" HorizontalAlignment="Stretch" Width="Auto"/>
    </StackPanel>
</Window>

और यह ऐसा दिखता है:

वैकल्पिक शब्द

वह टेक्स्टबॉक्स StackPanel क्यों नहीं भर रहा है?

मुझे पता है कि मैं एक Gridनियंत्रण का उपयोग करके अधिक नियंत्रण रख सकता हूं, मैं लेआउट के बारे में उलझन में हूं।

जवाबों:


146

मेरे पास एक ही समस्या है StackPanel, और व्यवहार "डिजाइन द्वारा" है। StackPanelदृश्य क्षेत्र के बाहर भी "स्टैकिंग" चीजों के लिए है, इसलिए यह आपको स्टैकिंग आयाम में शेष स्थान को भरने की अनुमति नहीं देगा।

आप एक का उपयोग कर सकते DockPanelके साथ LastChildFillसेट करने के लिए trueसभी गैर भरने नियंत्रण करने के लिए और गोदी Leftप्रभाव आप चाहते हैं अनुकरण करने के लिए।

<DockPanel Background="Orange" LastChildFill="True">
    <TextBlock Text="a label" Margin="5" 
        DockPanel.Dock="Left" VerticalAlignment="Center"/>
    <TextBox Height="25" Width="Auto"/>
</DockPanel >

7
बस स्पष्ट करने के लिए - LastChildFill डिफ़ॉल्ट रूप से "True" पर सेट है और TextBox के लिए खिंचाव के लिए HoroscopeAlignment सेट करने का कोई प्रभाव नहीं है। :-)
भूतल

1
@ गोबलिन: हाँ ... मैंने ओपी का कोड कॉपी और पेस्ट किया लेकिन हटाना भूल गया HorizontalAlignment। :)
जैच जॉनसन

गंभीरता से, यह डिजाइन द्वारा है? अजीब लगता है, क्योंकि नियंत्रण ही स्पष्ट रूप से पूरी चौड़ाई फैले हुए है। क्या आप कह रहे हैं कि सामग्री क्षेत्र आवश्यक रूप से दृश्य क्षेत्र के समान नहीं है?
हांक

1
@peter ने लंबे समय में wpf सामान नहीं किया है, लेकिन आप उपलब्ध स्थान ( stackoverflow.com/questions/12432189/… ) लेने के लिए पहले कॉलम सेट के साथ कुछ प्रकार की ग्रिड की कोशिश कर सकते हैं
Zach Johnson

6
मुझे यहां पार्टी में थोड़ी देर हो गई है, लेकिन @peter: आप FlowDirection="RightToLeft"इस पर उपयोग कर सकते हैं DockPanel, इसलिए आपका अंतिम बच्चा शेष स्थान का उपयोग करते हुए, बाईं ओर होगा।
डेनिस

16

मैं इसके बजाय ग्रिड का उपयोग करने की सलाह दूंगा:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="180" Width="324">

    <Grid Background="Orange">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="a label" 
           VerticalAlignment="Center"/>
        <TextBox  Grid.Column="1"/>
    </Grid>
</Window>

इस समस्या को हल करने का दूसरा तरीका सही के बजाय शीर्ष पर लेबल को स्टैक करना है। मैंने देखा कि UWP में एक हेडर प्रॉपर्टी है जिसे आप उस के लिए उपयोग कर सकते हैं, यह सुनिश्चित नहीं है कि क्या WPF के लिए हेडर प्रॉपर्टी मौजूद है।

<TextBox Header="MyLabel" />

2

वास्तविक विषय से पुराना सवाल:

HorizontalAlignment="Stretch"

आवश्यक बात है। Juste सुनिश्चित करें कि आप हटा दें width


1

मैं निम्नलिखित का उपयोग करके एक टेक्स्टबॉक्स के साथ एक StackPanel भरने में सक्षम हूं:

<StackPanel Margin="5,5,5,5">
    <Label Content = "lblExample" Width = "70" Padding="0" HorizontalAlignment="Left"/>
    <TextBox Name = "txtExample" Text = "Example Text" HorizontalContentAlignment="Stretch"/>
</StackPanel>

टेक्स्टबॉक्स क्षैतिज रूप से भरने वाले स्टैकपेनल


हाँ, लेकिन एक क्षैतिज स्टैकपैनल में नहीं; आपका कार्यक्षेत्र :-)
जेबी है। मोनिका के साथ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.