2008-09-16 35 views
3

Ben gruplar sola hakkı sarılı olan gruplarda öğeleri görüntülemek için bir liste kutusu oluşturduk zaman artık fit listbox en panelin yüksekliği içinde.WPF ListBox WrapPanel klipler uzun grupları

[ 1 ][ 3 ][ 5 ] 
[ ][ 4 ][ 6 ] 
[ 2 ][ ] 

aşağıdaki XAML bunun düzgün çalışır: Yani, gruplar her grubun yükseklik keyfi listbox içinde buna benzer görünecektir (grup 1, örneğin, grubun 2 iki katı boyunda) Sarma işlemini gerçekleştirir ve öğeler, ListBox'un sağ tarafındayken yatay kaydırma çubuğunun görünmesini sağlar.

Sorun, bir öğe grubu WrapPanel'in yüksekliğinden daha uzun olduğunda ortaya çıkar. Dikey kaydırma çubuğunun kesme öğesi grubunu görüntülemesine izin vermek yerine, bu gruptaki öğeler kolayca kırpılır. Bunun, WrapPanel'deki Yükseklik bağlamasının bir yan etkisi olduğunu farzediyorum - kaydırma çubuğu etkin olması gerekmediğini düşünüyor.

kaydırma çubuğunu, yoksa göremiyorum bu soruna başka bir yol etkinleştirmek için herhangi bir yolu var mı?

cevap

0

Bağlama ile ilgili olması gereken doğru olduğunu düşünürdüm. Bağlamayı kaldırdığınızda ne olur? Bağlama ile liste kutusunun en azından tüm yüksekliğini doldurmaya mı çalışıyorsunuz? Öyleyse, bunun yerine MinHeight'a bağlanmayı düşünün veya VerticalAlignment özelliğini kullanmayı deneyin.

0

Yanıtladığınız için teşekkürler, David. bağlama

removed, hiçbir sarma oluşur. WrapPanel her grubu tek bir dikey sütuna yerleştirir. Bağlama, WrapPanel'in gerçekte sarılmasını zorunlu kılmaktır. Hiçbir bağlanma ayarlanmazsa, WrapPanel, yüksekliğin sonsuz olduğunu varsayar ve hiçbir zaman sararmaz.

boş liste içinde MinHeight sonuçlarına bağlanması. VerticalAlignment özelliğinin nasıl bir çözüm olarak göründüğünü anlayabiliyorum, ancak hizalamanın kendisi herhangi bir sarmanın oluşmasını engelliyor. Bağlama ve hizalama birlikte kullanıldığında, hizalamanın problem üzerinde bir etkisi yoktur.

2

ScrollContentPresenter yüksekliğine WrapPanel üzerinde Yükseklik özelliğini ayarlayarak, dikey kaydırma asla. Ancak, bu Bağlamayı kaldırırsanız, hiçbir zaman sarılmayacaktır, çünkü düzen geçişinde, düzende sonsuz yüksekliğe sahiptir.

İstediğiniz davranışı almak için kendi panel sınıfınızı oluşturmanızı öneririm. İstediğiniz yüksekliğe bağlanabileceğiniz ayrı bir bağımlılık özelliğine sahip olursunuz, böylece bunu, ölçüdeki hedef yüksekliğini hesaplamak ve adımları düzenlemek için kullanabilirsiniz. Herhangi bir çocuk istenen yükseklikten daha uzunsa, sargıyı hesaplamak için o çocuğun boyunu hedef yükseklik olarak kullanın. Yatay ve dikey kaydırma hem veriyor - - Daha önce yayınlanmıştır Abe Heidebrecht, verilen tüm kredi

İşte
public class SmartWrapPanel : WrapPanel 
{ 
    /// <summary> 
    /// Identifies the DesiredHeight dependency property 
    /// </summary> 
    public static readonly DependencyProperty DesiredHeightProperty = DependencyProperty.Register(
     "DesiredHeight", 
     typeof(double), 
     typeof(SmartWrapPanel), 
     new FrameworkPropertyMetadata(Double.NaN, 
      FrameworkPropertyMetadataOptions.AffectsArrange | 
      FrameworkPropertyMetadataOptions.AffectsMeasure)); 

    /// <summary> 
    /// Gets or sets the height to attempt to be. If any child is taller than this, will use the child's height. 
    /// </summary> 
    public double DesiredHeight 
    { 
     get { return (double)GetValue(DesiredHeightProperty); } 
     set { SetValue(DesiredHeightProperty, value); } 
    } 

    protected override Size MeasureOverride(Size constraint) 
    { 
     Size ret = base.MeasureOverride(constraint); 
     double h = ret.Height; 

     if (!Double.IsNaN(DesiredHeight)) 
     { 
      h = DesiredHeight; 
      foreach (UIElement child in Children) 
      { 
       if (child.DesiredSize.Height > h) 
        h = child.DesiredSize.Height; 
      } 
     } 

     return new Size(ret.Width, h); 
    } 

    protected override System.Windows.Size ArrangeOverride(Size finalSize) 
    { 
     double h = finalSize.Height; 

     if (!Double.IsNaN(DesiredHeight)) 
     { 
      h = DesiredHeight; 
      foreach (UIElement child in Children) 
      { 
       if (child.DesiredSize.Height > h) 
        h = child.DesiredSize.Height; 
      } 
     } 

     return base.ArrangeOverride(new Size(finalSize.Width, h)); 
    } 
} 
+0

Bu * ihtiyacım neredeyse * kesin çözümdür. Dikey kaydırmanın gerçekleşmesini sağlar, ancak yatay kaydırma işlemini durdurur.Biraz değiştirdim (bir sonraki cevapta değiştirilmiş kod) ve mükemmel çalışıyor. Sağol Abe. –

2

biraz değiştirilmiş kod şudur: Burada

bunu yapmak için bir örnek paneldir. Tek değişiklik, MeasureOverride'in geri dönüş değerinin baz olması gerektiğidir.MeasureOverride (yeni Boyut (ret.width, h)).

// Original code : Abe Heidebrecht 
public class SmartWrapPanel : WrapPanel 
{ 
    /// <summary> 
    /// Identifies the DesiredHeight dependency property 
    /// </summary> 
    public static readonly DependencyProperty DesiredHeightProperty = DependencyProperty.Register(
    "DesiredHeight", 
    typeof(double), 
    typeof(SmartWrapPanel), 
    new FrameworkPropertyMetadata(Double.NaN, 
      FrameworkPropertyMetadataOptions.AffectsArrange | 
      FrameworkPropertyMetadataOptions.AffectsMeasure)); 

    /// <summary> 
    /// Gets or sets the height to attempt to be. If any child is taller than this, will use the child's height. 
    /// </summary> 
    public double DesiredHeight 
    { 
    get { return (double)GetValue(DesiredHeightProperty); } 
    set { SetValue(DesiredHeightProperty, value); } 
    } 

    protected override Size MeasureOverride(Size constraint) 
    { 
    Size ret = base.MeasureOverride(constraint); 
    double h = ret.Height; 

    if (!Double.IsNaN(DesiredHeight)) 
    { 
     h = DesiredHeight; 
     foreach (UIElement child in Children) 
     { 
     if (child.DesiredSize.Height > h) 
      h = child.DesiredSize.Height; 
     } 
    } 

    return base.MeasureOverride(new Size(ret.Width, h)); 
    } 

    protected override System.Windows.Size ArrangeOverride(Size finalSize) 
    { 
    double h = finalSize.Height; 

    if (!Double.IsNaN(DesiredHeight)) 
    { 
     h = DesiredHeight; 
     foreach (UIElement child in Children) 
     { 
     if (child.DesiredSize.Height > h) 
      h = child.DesiredSize.Height; 
     } 
    } 

    return base.ArrangeOverride(new Size(finalSize.Width, h)); 
    } 
}