मैं जो मैं निर्धारित करने के लिए एक नियंत्रण आंशिक रूप से या पूरी तरह से एक माता पिता के कंटेनर के भीतर दिखाई दे रहा है का उपयोग एक सहायक विधि है। आइटम की दृश्यता निर्धारित करने के लिए आप इसे 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>
में
ListBoxItem
के लिए एक अंतर्निहित शैली जोड़ा VirtualizingPanel.ScrollUnit' पर सेट है? क्योंकि, डिफ़ॉल्ट रूप से यह 'आइटम' पर सेट होता है, जो आप खोज रहे हैं। शायद कुछ कोड और स्क्रीनशॉट पोस्ट करें, और के बाद से यह एक डेवलपर पूर्वावलोकन है आप Microsoft कनेक्ट करने के लिए एक मुसीबत टिकट जमा कर सकता है अगर यह सही मायने में एक बग है? –मैं स्पष्ट रूप से 'स्क्रॉलउनीट' को 'आइटम' पर सेट कर रहा हूं। मैं अपना नमूना कोड संपादित और जोड़ दूंगा। –
जो मुझे पता है वह वर्चुअलाइजेशन की "विशेषता" है। गति के लिए जब प्रदर्शन कंटेनरों का पुन: उपयोग किया जाता है तो यह चौड़ाई का पुनर्मूल्यांकन नहीं करता है। आप क्षैतिज संरेखण संरेखण = खिंचाव का प्रयास कर सकते हैं।या आप स्ट्रिंग सूची को फिर से सक्रिय कर सकते हैं और सबसे बड़ी समायोजित करने के लिए चौड़ाई निर्धारित कर सकते हैं। या आप एक निश्चित चौड़ाई निर्धारित कर सकते हैं जो आपको लगता है कि अधिकतर संभाल लेंगे और टेक्स्ट रैपिंग चालू करें। – Paparazzi