Я делал это один раз до
Элементы существовали в настроенном ScrollViewer
, чтобы они могли выходить за пределы экрана, и событие SizeChanged
в ScrollViewer
проверит каждый элемент, чтобы увидеть, был ли он вне экрана или нет. Если бы он не был видимым или был частично видимым, то элемент скрылся бы, а объект данных был бы добавлен в Menu
. Если бы элемент был виден, он удалил бы его из Menu
, если он там существовал, и установил его видимым. Menu
был виден только при наличии предметов.
Это было сделано некоторое время назад, когда я был еще новичком в WPF, поэтому я уверен, что этот процесс можно улучшить.
Вспомогательный класс, который я использовал для определения видимости элемента, приведен ниже
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.Width, child.Height)));
Rect result = Rect.Intersect(new Rect(new Point(0, 0), parent.RenderSize), childSize);
if (result == Rect.Empty)
{
return ControlVisibility.Hidden;
}
else if (result.Height == childSize.Height && result.Width == childSize.Width)
{
return ControlVisibility.Full;
}
else if (result.Height == childSize.Height)
{
return ControlVisibility.FullHeightPartialWidth;
}
else if (result.Width == childSize.Width)
{
return ControlVisibility.FullWidthPartialHeight;
}
else
{
return ControlVisibility.Partial;
}
}
public enum ControlVisibility
{
Hidden,
Partial,
Full,
FullHeightPartialWidth,
FullWidthPartialHeight
}
Это можно использовать так:
ControlVisibility itemVisibility =
MyHelpers.IsObjectVisibleInContainer(someItem, parentContainer);