2008-12-22 19 views
11

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

<DockPanel> 
    <TreeView DockPanel.Dock="Left" Width="150"/> 
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <TextBlock Text="Name" 
         Margin="5" 
         VerticalAlignment="Center"/> 
      <TextBox Grid.Column="1" 
        Text="Some Name" 
        Margin="5" 
        VerticalAlignment="Center" 
        MinWidth="200"/> 
     </Grid> 
    </ScrollViewer> 
</DockPanel> 

सभी काम ठीक करने के लिए विंडो की सामग्री सेट कर रहा हूं, लेकिन जब उपयोगकर्ता पाठ बॉक्स में बहुत लंबे पाठ यह विस्तार किया है और किया जा रहा है क्षैतिज स्क्रॉल प्रकट होता है। क्या टेक्स्टबॉक्स अधिकतम चौड़ाई को सीमित करने का कोई आसान तरीका है और जब उपयोगकर्ता विंडो आकार बदलता है तो इसे केवल विस्तारित करने की अनुमति देता है।

उत्तर

31

समस्या यह है कि मूल तत्व टेक्स्टबॉक्स को जितना अधिक सोचते हैं उतना स्थान प्रदान कर रहे हैं, और जब अधिक टेक्स्ट मौजूद होता है तो यह प्रारंभिक स्वचालित आकार में रहने के बजाय विस्तारित होगा। यहाँ

एक समाधान यह करने के लिए एक और स्वतः आकार तत्व TextBox.Width बनाने के लिए और बाध्य करने के लिए है:

<DockPanel> 
    <TreeView Width="150" DockPanel.Dock="Left"/> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <TextBlock Margin="5" VerticalAlignment="Center" Text="Name"/> 
      <Border x:Name="b" Grid.Column="1" Margin="5"/> 
      <TextBox Width="{Binding ActualWidth, ElementName=b}" 
        MinWidth="200" 
        Grid.Column="1" 
        Margin="5" 
        VerticalAlignment="Center" 
        Text="Some Name"/> 
     </Grid> 
    </ScrollViewer> 
</DockPanel> 

ध्यान दें कि हम स्वत: आकार देने वाला तत्व (सीमा) के मार्जिन गुण सेट। यह महत्वपूर्ण है क्योंकि अगर यह स्थापित नहीं किया गया है, वहाँ एक पाश होगा:

  1. बॉर्डर चौड़ाई ग्रिड स्तंभ चौड़ाई को autosizes
  2. पाठ बॉक्स चौड़ाई का आकार बदलता है Border.ActualWidth को
  3. ग्रिड स्तंभ चौड़ाई पाठ बॉक्स चौड़ाई के आकार बदलता है + पाठ बॉक्स मार्जिन
  4. बॉर्डर चौड़ाई ग्रिड स्तंभ चौड़ाई फिर

को autosizes पाठ बॉक्स के रूप में ही करने के लिए मार्जिन की स्थापना करके, टेक्स्ट बॉक्स का आकार बदलने Gri को प्रभावित नहीं करेगा डी आकार

+0

धन्यवाद ... बहुत बढ़िया है! – Jose

+1

रॉबर्ट के समाधान के आधार पर कोड के साथ टंकण करने के बाद, मुझे एक टेक्स्टबॉक्स के मैक्सविड्थ को संलग्न तत्व में बाध्य करने के लिए उपयोगी पाया गया। ऐसा लगता है कि कुछ अनुप्रयोगों के लिए अनंत-आकार बदलने वाली लूप वाली समस्याओं से बचें। – estanford

+3

ठीक काम करता है, लेकिन जब विंडो छोटी हो जाती है तो टेक्स्टबॉक्स अपने बड़े आकार में रहता है। इसके लिए कोई फिक्स? – Heinzi

0

नहीं - यह डब्ल्यूपीएफ की एक अच्छी तरह से ज्ञात समस्या है और अगले रिलीज में तय होने की उम्मीद है। धन्यवाद

2

अधिभावी TextBox.MeasureOverride तो मेरे लिए काम किया है जैसे:

protected override Size MeasureOverride(Size constraint) 
{ 
    Size origSize = base.MeasureOverride(constraint); 
    origSize.Width = MinWidth; 
    return origSize; 
} 
+0

और आप मिनविड्थ को समापन कॉलम से कैसे जोड़ते हैं? –

संबंधित मुद्दे