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>
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. –Ben açıkça 'ScrollUnit'' 'Item' olarak ayarlıyorum. Örnek kodumu düzenleyip ekleyeceğim. –
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