Динамический интервал между элементами управления на панели инструментов в WPF - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть панель инструментов, которая содержит несколько элементов управления, скажем, 10.

Я хочу разместить последние три элемента управления в правом углу панели инструментов, оставив некоторое пространство между этими тремя элементами управления и оставшимися элементами управления.

Когда я изменяю размер окна, оно должно уменьшать пространство, и если места нет, его нужно закрепить, чтобы переполнение выпало по одному.

Примечание. Мне нужно использовать только одну панель инструментов.

1 Ответ

0 голосов
/ 20 февраля 2012

Я делал это один раз до

Элементы существовали в настроенном 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);
...