2009-05-10 20 views
17

के अंदर ग्रिड व्यू कॉलम का फोर्स का आकार बदलें मेरे पास GridView के साथ ListView डब्ल्यूपीएफ नियंत्रण है। जब कॉलम की सामग्री बदल जाती है तो मैं GridView कॉलम का आकार बदलना चाहता हूं।लिस्ट व्यू

मेरे पास कई अलग-अलग डेटा सेट हैं लेकिन जब मैं एक से दूसरे में बदलता हूं, तो प्रत्येक कॉलम का आकार पिछले डेटा को फिट करता है। मैं गतिशील रूप से अद्यतन करना चाहता हूँ। मैं उसे कैसे कर सकता हूँ?

+2

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

+0

+1, यह मुझे पागल कर रहा है! – Oskar

उत्तर

-1

आप पिक्सल में सबसे लंबे समय तक स्ट्रिंग आकलन कर सकता है और फिर उसके अनुसार स्तंभ चौड़ाई समायोजित:

Graphics graphics = this.CreateGraphics(); 
SizeF textSize = graphics.MeasureString("How long am I?", this.Font); 

आप इन लंबाई में से एक अनुपात के रूप में प्रत्येक स्तंभ आकार के लिए एक एल्गोरिथ्म बनाते हैं, तो आप एक अच्छे परिणाम मिलना चाहिए।

+0

ठीक है मुझे लगता है कि यह WPF और बाध्यकारी के साथ काम नहीं करेगा ... –

29

अंत में, इस पर कुछ परिणाम। मुझे एक ही ऑटो-साइजिंग करने का एक तरीका मिला है जो प्रारंभ में किया जाता है और जब कॉलम हेडर पर ग्रिपर डबल क्लिक किया जाता है।

public void AutoSizeColumns() 
{ 
    GridView gv = listView1.View as GridView; 
    if (gv != null) 
    { 
     foreach (var c in gv.Columns) 
     { 
      // Code below was found in GridViewColumnHeader.OnGripperDoubleClicked() event handler (using Reflector) 
      // i.e. it is the same code that is executed when the gripper is double clicked 
      if (double.IsNaN(c.Width)) 
      { 
       c.Width = c.ActualWidth; 
      } 
      c.Width = double.NaN; 
     } 
    } 
} 
+0

ग्रेट समाधान। धन्यवाद। –

1

क्या कॉलम के ActualWidth से जुड़ने का कोई तरीका नहीं है? कुछ की तरह:

<GridViewColumn x:Name="column1" Width="{Binding ElementName=column1, Path=ActualWidth}" /> 

मैं इस की कोशिश की है और यह केवल पहली बार काम करता है, ऐसा लगता है। कोई बाध्यकारी त्रुटि नहीं।

+0

मैंने यह भी कोशिश की है: चौड़ाई = "{बाध्यकारी पथ = वास्तविक विजिट, सापेक्ष स्रोत = {x: स्टेटिक रिलेटिव स्रोत।}}" – Thia

+0

हाँ, आप वास्तविकता को वास्तविकता पर प्रतिलिपि बनाते हैं, जो तब तक इच्छित चौड़ाई है। ऑटो-साइजिंग पहली बार अक्षम है। वास्तविक विवाद फिर कभी नहीं बदलता है, इसलिए इच्छित चौड़ाई या तो नहीं होगी। – ygoe

4

ओस्कर उत्तर के शीर्ष पर बिल्डिंग, सामग्री बदलते समय कॉलम स्वचालित रूप से आकार देने के लिए एक मिश्रण व्यवहार है।

Public Sub AutoSizeColumns() 
    Dim gv As GridView = TryCast(Me.listview1.View, GridView) 
    If gv IsNot Nothing Then 
     For Each c As GridViewColumn In gv.Columns 
      If Double.IsNaN(c.Width) Then 
       c.Width = c.ActualWidth 
      End If 
      c.Width = Double.NaN 
     Next 
    End If 
End Sub 

यह WPF में अच्छा काम करता है, अंत में किसी को इस पर काम किया गया है:

/// <summary> 
/// A <see cref="Behavior{T}"/> implementation which will automatically resize the automatic columns of a <see cref="ListView">ListViews</see> <see cref="GridView"/> to the new content. 
/// </summary> 
public class GridViewColumnResizeBehaviour : Behavior<ListView> 
{ 
     /// <summary> 
     /// Listens for when the <see cref="ItemsControl.Items"/> collection changes. 
     /// </summary> 
     protected override void OnAttached() 
     { 
      base.OnAttached(); 

      var listView = AssociatedObject; 
      if (listView == null) 
       return; 

      AddHandler(listView.Items); 
     } 

     private void AddHandler(INotifyCollectionChanged sourceCollection) 
     { 
      Contract.Requires(sourceCollection != null); 

      sourceCollection.CollectionChanged += OnListViewItemsCollectionChanged; 
     } 

     private void RemoveHandler(INotifyCollectionChanged sourceCollection) 
     { 
      Contract.Requires(sourceCollection != null); 

      sourceCollection.CollectionChanged -= OnListViewItemsCollectionChanged; 
     } 

     private void OnListViewItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs) 
     { 
      var listView = AssociatedObject; 
      if (listView == null) 
       return; 

      var gridView = listView.View as GridView; 
      if (gridView == null) 
       return; 

      // If the column is automatically sized, change the column width to re-apply automatic width 
      foreach (var column in gridView.Columns.Where(column => Double.IsNaN(column.Width))) 
      { 
       Contract.Assume(column != null); 
       column.Width = column.ActualWidth; 
       column.Width = Double.NaN; 
      } 
     } 

     /// <summary> 
     /// Stops listening for when the <see cref="ItemsControl.Items"/> collection changes. 
     /// </summary> 
     protected override void OnDetaching() 
     { 
      var listView = AssociatedObject; 
      if (listView != null) 
       RemoveHandler(listView.Items); 

      base.OnDetaching(); 
     } 
} 
+0

यह व्यवहार इस बात पर ध्यान नहीं देता है कि नई 'वास्तविक विड्थ' की गणना होने तक इसमें कुछ समय लग सकता है। इसलिए ऐसा हो सकता है कि सामग्री को फिट करने के लिए अभी भी 'वास्तविक Width' बहुत छोटा है। – Danielku15

+0

@ डैनियलकु 15 क्या आपको लगता है कि यह हो रहा है? एक छोटा सा नमूना बहुत अच्छा होगा इसलिए मैं इस समस्या को ठीक करने के लिए काम कर सकता हूं। – Lukazoid

+1

मेरे पास एक ObsVableCollection के लिए एक सूची दृश्य है। मेरे सेल टेम्पलेट में मेरा नियंत्रण है जो 40x40pt है। व्यवहार को जोड़ना ऑनलिस्टस्टिव इटम्स कोलेक्शन चेंज विधि को निष्पादित करता है, लेकिन वास्तविक विडियो अभी भी बहुत छोटा है (मेरे मामले में 25pt)। परिणाम: यह फसल है। ऐसा लगता है कि हैंडलर निष्पादित होने पर लेआउटप्रोसेस नहीं चला था। – Danielku15

1

मेरे जैसे आप बूढ़े हो जाएंगे और फिर यहाँ VB.NET पसंद करते हैं Oskars कोड है। धन्यवाद ओस्कर।

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