控制哪些项目离开堆栈面板的可见区域

时间:2013-03-19 10:23:26

标签: c# wpf vb.net wpf-controls

在调整大小时,有没有办法控制哪些项目离开堆叠面板的可见区域?
感谢

更新1
我在堆叠面板内有固定数量的按钮。调整堆栈面板可见区域的大小时,每个按钮会根据可用空间自动隐藏或显示。通过某些事件,我希望通过控制哪些按钮隐藏或显示堆栈面板调整大小来实现。

原因是,我想创建按钮的最小化版本,而不是隐藏按钮。

2 个答案:

答案 0 :(得分:1)

在过去,我通过根据对象的大小更改对象的ContentTemplate来做类似的事情。

通常我会向父对象的LoadedSizeChanged事件添加一个事件,并从中确定控件是否可见。如果没有,我将模板更改为较小版本的模板。

关于SizeChanged事件未被解雇的your comment here,可能是因为您的对象位于StackPanel,这将会增长/缩小以适应其子女的大小,不要匹配它的父级(Grid单元格)的大小。

您也可以使用实际UI对象上的DataTriggerConverter来执行此操作,因此当控件的ActualWidth或{{{}时,它会自动检查模板是否应该更改1}}改变。

我有一个帮助器类,用于确定UI控件在其父对象中的确切可见性,以确定它是完全或部分可见,还是完全隐藏。代码可以在this answer找到,虽然我也会在这里复制它:

ActualHeight

您可以获得控件的可见性:

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.Width, child.Height)));

    Rect result = Rect.Intersect(
        new Rect(new Point(0, 0), parent.RenderSize), childSize);

    if (result == Rect.Empty)
    {
        return ControlVisibility.Hidden;
    }
    if (result.Height == childSize.Height && result.Width == childSize.Width)
    {
        return ControlVisibility.Full;
    }
    if (result.Height == childSize.Height)
    {
        return ControlVisibility.FullHeightPartialWidth;
    }
    if (result.Width == childSize.Width)
    {
        return ControlVisibility.FullWidthPartialHeight;
    }
    return ControlVisibility.Partial;
}

答案 1 :(得分:1)

“SizeChanged”事件未触发的原因是我将其高度设置为固定值。将其设置为“auto”后,在调整其父容器大小时触发事件。