Как мне реализовать Telerik RadPageView с минимальными требованиями к высоте? - PullRequest
2 голосов
/ 15 ноября 2011

У меня настроен элемент управления Telerik RadPageView (Q2 2011 SP1) как ViewMode "Outlook" в моем приложении winforms C #.По моему требованию у меня ограниченное пространство для отображения элемента управления (около 600 пикселей в высоту).Когда к элементу управления добавлено более 5 страниц, панель просмотра (открытая область над селекторами страниц) становится меньше и обрезает содержимое (желтая область на снимках экрана ниже).Я хотел бы знать, есть ли способ установить минимальную высоту в этой области, чтобы элемент управления автоматически свернул селекторы страниц, которые он не может уместить в этом ограниченном пространстве.Мне нужно около 300px высоты для каждой страницы.

Я уже пытался установить свойство MinimumSize для каждого RadPageViewPage.Однако, когда я делаю это, страница просмотра страницы «кровоточит» поверх селекторов страницы.Я ожидал, что ручка (перетаскиваемая часть элемента управления) автоматически изменит размеры, чтобы учесть это требование минимальной высоты.

Пожалуйста, смотрите снимки экрана из моего примера приложения ниже:

Проблема:

enter image description here

Требуется:

enter image description here

Обновление:

Мне удалось создать функцию, которая программно регулирует положение ручки при срабатывании событий «Инициализация» или «Изменение размера».Я понимаю, что, скорее всего, мне нужно будет вызвать эту функцию, когда выбранная страница также изменится.

В любом случае, вот фрагмент:

private void adjustPageViewGrip()
{
    RadPageViewOutlookElement viewElement = (RadPageViewOutlookElement)radPageView.ViewElement;
    int minHeight = 300;
    int itemHeight = radPageView.SelectedPage.Item.Size.Height;
    int selectedPageHeight = radPageView.SelectedPage.Height;

    if (selectedPageHeight < minHeight)
    {
        int hide = (int)Math.Ceiling((double)(minHeight - selectedPageHeight) / (double)itemHeight);
        if (hide > 0)
        {
            viewElement.HideItems(hide);
        }
    }
    else if ((selectedPageHeight + itemHeight) >= minHeight)
    {
        int show = (int)Math.Floor((double)(selectedPageHeight - minHeight) / (double)itemHeight);
        if (show > 0)
        {
            viewElement.ShowItems(show);
        }
    }
}

Мне все еще интересно, нужен ли мне этот код.Может ли управление уже сделать это?

1 Ответ

2 голосов
/ 18 ноября 2011

Я разместил этот же вопрос на форуме Telerik и обнаружил, что элемент управления фактически не поддерживает то, что я спрашивал выше.

В конце я настроил функцию вычисления необходимых высот, а не их жесткого кодирования.После расчета высоты функция отображает или скрывает правильное количество необходимых страниц.Функция теперь вызывается событиями OnLoad, Initialized, Resized и SelectedPageChanged в расширенном классе.Я также сделал OutlookViewOverflowGrip невидимым, свернув его, и я полагаюсь на новый код, чтобы настроить его положение для меня.

Вот код для окончательных результатов:

/// <summary>
/// Adjusts the position of the Outlook overflow grip.
/// </summary>
public void AdjustOutlookViewOverflowGrip()
{
    if (ViewMode == PageViewMode.Outlook && SelectedPage != null)
    {
        // Fix rendering bug by hiding RadPageViewPage's that are not currently selected
        foreach (RadPageViewPage page in Pages)
        {
            if (page == SelectedPage)
            {
                page.Show();
            }
            else
            {
                page.Hide();
            }
        }

        // Elements from control
        RadPageViewOutlookElement outlookElement = (RadPageViewOutlookElement)ViewElement;
        OverflowItemsContainer overflowItemsContainer = (OverflowItemsContainer)GetChildAt(0).GetChildAt(4);

        // Selected page and item heights
        int selectedPageMinHeight = (SelectedPage.MinimumSize.Height > ContentMinimumHeight ? SelectedPage.MinimumSize.Height : contentMinimumHeight);
        int pageSelectorHeight = SelectedPage.Item.Size.Height;

        // Show or hide items
        if (pageSelectorHeight > 0 && selectedPageMinHeight > 0)
        {
            // Calculate content area height
            int contentAreaHeight =                 
                (
                    Size.Height -
                    (
                        from element in ((RadPageViewOutlookElement)ViewElement).Children
                        where
                        (
                            element.Visibility != ElementVisibility.Collapsed
                            &&
                            (
                                element is RadPageViewLabelElement
                                || element is OutlookViewOverflowGrip
                                || element is RadPageViewOutlookItem
                                || element is OverflowItemsContainer
                            )
                        )
                        select element.Size.Height + element.Margin.Vertical
                    )
                    .Sum()
                );

            if (contentAreaHeight < selectedPageMinHeight)
            {
                // Factor in OverflowItemsContainer height if it's currently collapsed
                int overflowItemsHeight = (overflowItemsContainer.Visibility == ElementVisibility.Collapsed ? overflowItemsContainer.Size.Height : 0);

                // Not enough space available... hide items
                int hide = (int)Math.Ceiling((double)(selectedPageMinHeight - contentAreaHeight + overflowItemsHeight) / (double)pageSelectorHeight);
                if (hide > 0)
                {
                    outlookElement.HideItems(hide);
                }
            }
            else if (contentAreaHeight >= (selectedPageMinHeight + pageSelectorHeight))
            {
                // More space available... show items
                int show = (int)Math.Floor((double)(contentAreaHeight - selectedPageMinHeight) / (double)pageSelectorHeight);
                if (show > 0)
                {
                    outlookElement.ShowItems(show);
                }
            }
        }

        // Set overflow container visiblity
        overflowItemsContainer.Visibility = (outlookElement.GetHiddenItems().Length > 0 ? ElementVisibility.Visible : ElementVisibility.Collapsed);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...