5
आइटम

फसल नहीं है इसलिए, यह करता है, तो आइटम कटौती हो रही है/स्क्रॉल क्षेत्र के अंत में काटी एक क्रोम कम संग्रह के लिए वास्तव में मूर्खतापूर्ण लग रहा है।virtualizing पैनल कि

मैं संग्रह के लिए एक virtualizing पैनल (ItemsControl/ListBox) है कि केवल पूरे आइटम, मदों की कभी नहीं टुकड़े खींचता है बनाना चाहते हैं। उदाहरण के लिए:

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

enter image description here

मैं नहीं चाहता कि जब तक वहाँ है के लिए पूरे मद/कंटेनर प्रदर्शित करने के लिए कमरे 3 आंशिक कंटेनर प्रदर्शित करना चाहते हैं। उदाहरणों में, अंतरिक्ष की कमी की वजह से तीसरा आइटम फसल लगाया गया था।

कोई सुझाव? क्या मुझे पहिया को फिर से शुरू करने की कोशिश करनी चाहिए (अपना खुद का VirtualizingWholeItemPanel बनाएं)?

संपादित:

माइक्रोसॉफ्ट ने स्पष्ट किया कि VirtualizingPanel.ScrollUnit पर यह सब कार्यशीलता प्रदर्शन करने के लिए इरादा नहीं है। ऐसा लगता है कि VirtualizingPanel.ScrollUnit वर्ष CanContentScrollScrollViewer पर काफ़ी मिलती-जुलती उद्देश्य में कार्य करता।

+0

में ListBoxItem के लिए एक अंतर्निहित शैली जोड़ा VirtualizingPanel.ScrollUnit' पर सेट है? क्योंकि, डिफ़ॉल्ट रूप से यह 'आइटम' पर सेट होता है, जो आप खोज रहे हैं। शायद कुछ कोड और स्क्रीनशॉट पोस्ट करें, और के बाद से यह एक डेवलपर पूर्वावलोकन है आप Microsoft कनेक्ट करने के लिए एक मुसीबत टिकट जमा कर सकता है अगर यह सही मायने में एक बग है? –

+0

मैं स्पष्ट रूप से 'स्क्रॉलउनीट' को 'आइटम' पर सेट कर रहा हूं। मैं अपना नमूना कोड संपादित और जोड़ दूंगा। –

+0

जो मुझे पता है वह वर्चुअलाइजेशन की "विशेषता" है। गति के लिए जब प्रदर्शन कंटेनरों का पुन: उपयोग किया जाता है तो यह चौड़ाई का पुनर्मूल्यांकन नहीं करता है। आप क्षैतिज संरेखण संरेखण = खिंचाव का प्रयास कर सकते हैं।या आप स्ट्रिंग सूची को फिर से सक्रिय कर सकते हैं और सबसे बड़ी समायोजित करने के लिए चौड़ाई निर्धारित कर सकते हैं। या आप एक निश्चित चौड़ाई निर्धारित कर सकते हैं जो आपको लगता है कि अधिकतर संभाल लेंगे और टेक्स्ट रैपिंग चालू करें। – Paparazzi

उत्तर

4

मैं जो मैं निर्धारित करने के लिए एक नियंत्रण आंशिक रूप से या पूरी तरह से एक माता पिता के कंटेनर के भीतर दिखाई दे रहा है का उपयोग एक सहायक विधि है। आइटम की दृश्यता निर्धारित करने के लिए आप इसे Converter के साथ उपयोग कर सकते हैं।

आपके कनवर्टर को या तो यूआई आइटम से मूल कंटेनर की गणना करने की आवश्यकता होगी (मेरे ब्लॉग में Visual Tree Helpers का एक सेट है जो आपकी इच्छानुसार सहायता कर सकता है), या यह MultiConverter हो सकता है जो यूआई आइटम और दोनों को स्वीकार करता है पैरामीटर के रूप में पैरेंट कंटेनर।

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

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

कोड एक नियंत्रण की दृश्यता निर्धारित करने के लिए यह भीतर माता-पिता इस तरह दिखता है:

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; 
} 

संपादित

कुछ परीक्षण किया और जाहिरा तौर पर कनवर्टर से पहले नियंत्रण वास्तव में प्रदान की गई हैं, उन्हें चलने हो जाता है। हैक रूप में, यह अगर आप एक MultiConverter उपयोग करें और यह नियंत्रण है, जो फिर से मूल्यांकन करने के लिए जब नियंत्रण गाया जाता कनवर्टर के लिए बाध्य करेगा की ActualHeight पारित काम करेंगे।

यहाँ कनवर्टर मैं उपयोग कर रहा था है:

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; 
    } 
} 

मैं XAML आप अपने प्रश्न में तैनात थे, और केवल आपके क्या बदलाव आ रहे हैं `.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

नियंत्रण दृश्यता को '[ध्वज]' गणना में बदल दिया जा सकता है। कुछ भी नहीं बदल रहा है, लेकिन सिर्फ एक सुझाव है। –

+0

अच्छी पोस्ट। धन्यवाद! –

+1

@ एम-वाई: मुझे नहीं लगता कि यह झंडे की गणना करने का कोई कारण होगा। मूल्य कभी भी संभावनाओं में से एक से अधिक नहीं होना चाहिए। मेरी समझ से झंडे enums का उपयोग बूलियन और, | के साथ कई मूल्यों को एक साथ जोड़ने के लिए किया जाता है। –

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