5

Bu nedenle, öğeler kaydırma bölgesinin sonunda kesilirse/kırpılırsa, kromsuz bir koleksiyona sahip olmak çok saçma görünür.Öğeleri kırpmayan Sanallaştırma Paneli

Koleksiyonlar (ItemsControl/ListBox) için yalnızca tüm öğeleri çizen, asla parçaları olmayan bir sanallaştırma paneli oluşturmak istiyorum. Örneğin:

______________ 
|    | 
|______________| 
______________ 
|    | 
|______________| 
______________ 
|    | 

enter image description here

Ben BÜTÜN madde/konteyner görüntülenmesi için oda olmadığı sürece 3 parsiyel konteyner görüntülenecek istemiyoruz. Örneklerde, üçüncü madde, alan eksikliği nedeniyle kırpılmıştır.

Herhangi bir öneriniz var mı? Tekerleği yeniden icat etmeye çalışmalı mıyım (kendi VirtualizingWholeItemPanel'u kendim inşa etmeliyim)?

DÜZENLEME:

Microsoft VirtualizingPanel.ScrollUnit hiç bu işlevselliği gerçekleştirmek için tasarlanmamıştır olduğunu açıkladı. VirtualizingPanel.ScrollUnit'un numaralı telefondaki eski CanContentScroll için çok benzer bir amaca hizmet ettiği anlaşılmaktadır.

+0

yılında ListBoxItem için örtük bir stil eklendi VirtualizingPanel.ScrollUnit' ayarlandı mı? Çünkü, varsayılan olarak, aradığınız şey olan "Öğe" olarak ayarlanır. Belki de bazı kod ve ekran görüntüleri yayınlayın ve bu bir Geliştirici Önizlemesi olduğundan, gerçekten bir hata ise Microsoft Connect'e bir sorun bildirimi gönderebilirsiniz. –

+0

Ben açıkça 'ScrollUnit'' 'Item' olarak ayarlıyorum. Örnek kodumu düzenleyip ekleyeceğim. –

+0

Bildiğim kadarıyla sanallaştırmanın bir "özelliği" dir. Hız için, ekran konteynırları yeniden kullanıldığında genişliği yeniden değerlendirmez. Horizontalcontent alignment = stretch'i deneyebilirsiniz.Ya da dize listesini yineleyebilir ve genişliği en büyüğü olacak şekilde ayarlayabilirsiniz. Ya da en fazla işleyeceğini düşündüğünüz sabit bir genişlik ve metin kaydırma özelliğini açabilirsiniz. – Paparazzi

cevap

4

Bir denetimin bir üst kapsayıcıda kısmen veya tamamen görünür olup olmadığını belirlemek için kullandığım yardımcı bir yöntemim var. Öğelerin görünürlüğünü belirlemek için muhtemelen bir Converter ile kullanabilirsiniz.

Dönüştürücünüzün ana kapsayıcıyı UI öğesinden hesaplaması gerekir (Blogumda, isterseniz bu yardımcı olabilecek Visual Tree Helpers kümesi vardır) veya hem kullanıcı arabirimi hem de kullanıcı arabirimini kabul eden MultiConverter olabilir. üst kapsayıcı parametre olarak. o ana şuna benzer var içinde

ControlVisibility ctrlVisibility= 
    WPFHelpers.IsObjectVisibleInContainer(childControl, parentContainer); 

if (ctrlVisibility == ControlVisibility.Full 
    || isVisible == ControlVisibility.FullHeightPartialWidth) 
{ 
    return Visibility.Visible; 
} 
else 
{ 
    return = Visibility.Hidden; 
} 

kod

bir denetimin görünürlük belirlemek için:

public enum ControlVisibility 
{ 
    Hidden, 
    Partial, 
    Full, 
    FullHeightPartialWidth, 
    FullWidthPartialHeight 
} 


/// <summary> 
/// Checks to see if an object is rendered visible within a parent container 
/// </summary> 
/// <param name="child">UI element of child object</param> 
/// <param name="parent">UI Element of parent object</param> 
/// <returns>ControlVisibility Enum</returns> 
public static ControlVisibility IsObjectVisibleInContainer(
    FrameworkElement child, UIElement parent) 
{ 
    GeneralTransform childTransform = child.TransformToAncestor(parent); 
    Rect childSize = childTransform.TransformBounds(
     new Rect(new Point(0, 0), new Point(child.ActualWidth, child.ActualHeight))); 

    Rect result = Rect.Intersect(
     new Rect(new Point(0, 0), parent.RenderSize), childSize); 

    if (result == Rect.Empty) 
    { 
     return ControlVisibility.Hidden; 
    } 
    if (Math.Round(result.Height, 2) == childSize.Height 
     && Math.Round(result.Width, 2) == childSize.Width) 
    { 
     return ControlVisibility.Full; 
    } 
    if (result.Height == childSize.Height) 
    { 
     return ControlVisibility.FullHeightPartialWidth; 
    } 
    if (result.Width == childSize.Width) 
    { 
     return ControlVisibility.FullWidthPartialHeight; 
    } 
    return ControlVisibility.Partial; 
} 

Düzenleme

bazı testler yaptım ve kontroller aslında işlenir önce görünüşte dönüştürücü çalıştırılmasına. Bir hack olarak, bir MultiConverter kullanır ve kontrolün oluşturulduğu zaman dönüştürücünün yeniden değerlendirmesini zorlayacak şekilde ActualHeight kontrolünü iletir. İşte

ben kullanıyordum dönüştürücü var:

public class TestConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     FrameworkElement child = values[0] as FrameworkElement; 
     var parent = VisualTreeHelpers.FindAncestor<ListBox>(child); 

     ControlVisibility ctrlVisibility = 
      VisualTreeHelpers.IsObjectVisibleInContainer(child, parent); 

     if (ctrlVisibility == ControlVisibility.Full 
      || ctrlVisibility == ControlVisibility.FullHeightPartialWidth) 
     { 
      return Visibility.Visible; 
     } 
     else 
     { 
      return Visibility.Hidden; 
     } 
    } 

    public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 

Ben senin soru yayınlanmıştır XAML kullanılan ve sadece `ne değiştiriyor musunuz .Resources

<ListBox.Resources> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Visibility"> 
      <Setter.Value> 
       <MultiBinding Converter="{StaticResource Converter}"> 
        <Binding RelativeSource="{RelativeSource Self}" /> 
        <Binding RelativeSource="{RelativeSource Self}" Path="ActualHeight" /> 
       </MultiBinding> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ListBox.Resources> 
+0

ControlVisibility bir '[Flags] numarasına dönüştürülebilir. Hiçbir şey değişmeyen oyun, ama sadece bir öneri. –

+0

İyi gönderi. Teşekkür ederim! –

+1

@ m-y: Ben bayrak sayımı yapmak için herhangi bir sebep olacağını düşünmüyorum. Değer hiçbir zaman olasılıkların birinden fazlasına eşit olmamalıdır. Anlayış bayraklarımdan enumlar, boolean &, | ile birlikte çoklu değerleri birleştirmek için kullanılır. –