C# 如何实现Telerik RadPageView的最低高度要求?

C# 如何实现Telerik RadPageView的最低高度要求?,c#,winforms,telerik,C#,Winforms,Telerik,我在winforms C#应用程序中将Telerik RadPageView控件(2011年第2季度SP1)设置为ViewMode“Outlook”。根据我的要求,我有一个有限的空间来显示控件(大约600像素的高度)。当控件添加了5个以上的页面时,视图面板(页面选择器上方的打开区域)将变小并切断内容(下面屏幕截图中的黄色区域)。我想知道是否有办法在这个区域强制执行一个最小高度,这样控件就会自动折叠页面选择器,因为它无法在这个有限的空间中放置。我需要大约300像素的高度为每一页 我已经尝试在每个R

我在winforms C#应用程序中将Telerik RadPageView控件(2011年第2季度SP1)设置为ViewMode“Outlook”。根据我的要求,我有一个有限的空间来显示控件(大约600像素的高度)。当控件添加了5个以上的页面时,视图面板(页面选择器上方的打开区域)将变小并切断内容(下面屏幕截图中的黄色区域)。我想知道是否有办法在这个区域强制执行一个最小高度,这样控件就会自动折叠页面选择器,因为它无法在这个有限的空间中放置。我需要大约300像素的高度为每一页

我已经尝试在每个RadPageViewPage上设置MinimumSize属性。但是,当我这样做时,页面视图页面会在页面选择器的顶部“出血”。我希望夹点(控件的可拖动部分)能够自动调整大小,以满足此最低高度要求

请参见下面我的示例应用程序的屏幕截图:

问题:

所需:

更新:

我能够创建一个函数,在触发“初始化”或“调整大小”事件时以编程方式调整夹点位置。我意识到,当所选页面也发生更改时,我很可能需要调用此函数

不管怎样,下面是一个片段:

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);
        }
    }
}
private void adjustPageViewGrip()
{
RadPageViewOutlookElement viewElement=(RadPageViewOutlookElement)radPageView.viewElement;
int最小高度=300;
int itemHeight=radPageView.SelectedPage.Item.Size.Height;
int selectedPageHeight=radPageView.SelectedPage.Height;
如果(已选择页面高度<最小高度)
{
int hide=(int)数学上限((double)(最小高度-所选页面高度)/(double)项目高度);
如果(隐藏>0)
{
viewElement.HideItems(隐藏);
}
}
如果((selectedPageHeight+itemHeight)>=最小高度),则为else
{
int show=(int)Math.Floor((double)(selectedPageHeight-minHeight)/(double)itemHeight);
如果(显示>0)
{
viewElement.ShowItems(显示);
}
}
}
我仍然很好奇我是否需要这个代码。控件已经可以这样做了吗?

我在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);
    }
}
//
///调整Outlook溢出夹点的位置。
/// 
public void AdjustOutlookViewOverflowGrip()
{
if(ViewMode==PageViewMode.Outlook&&SelectedPage!=null)
{
//通过隐藏当前未选中的RadPageViewPage修复渲染错误
foreach(RadPageViewPage页中页)
{
如果(页面==所选页面)
{
page.Show();
}
其他的
{
page.Hide();
}
}
//来自控制的元素
RadPageViewOutlookElement=(RadPageViewOutlookElement)ViewElement;
OverflowItemsContainer OverflowItemsContainer=(OverflowItemsContainer)GetChildAt(0)。GetChildAt(4);
//所选页面和项目高度
int selectedPageMinHeight=(SelectedPage.MinimumSize.Height>ContentMinimumHeight?SelectedPage.MinimumSize.Height:ContentMinimumHeight);
int pageSelectorHeight=SelectedPage.Item.Size.Height;
//显示或隐藏项目
如果(pageSelectorHeight>0&&selectedPageMinHeight>0)
{
//计算内容区域高度
int contentAreaHeight=
(
尺寸,高度-
(
来自((RadPageViewOutlookElement)ViewElement中的元素。子元素
哪里
(
element.Visibility!=ElementVisibility.Collapsed
&&
(
元素是RadPageViewLabelement
||元素是OutlookViewOverflowGrip
||元素是RadPageViewOutlookItem
||元素为OverflowItemsContainer
)
)
选择element.Size.Height+element.Margin.Vertical
)
.Sum()
);
if(contentAreaHeight0)
{
outlookElement.HideItems(隐藏);
}
}
否则如果(contentAreaHeight>=(selectedPageMinHeight+pageSelectorHeight))
{
//更多可用空间…显示项目
int show=(int)数学地板((双精度)(内容区域高度-所选页面最小高度)/(双精度)页面