4

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

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

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

4

2 回答 2

1

在过去,我通过ContentTemplate根据对象的大小改变对象的大小来完成类似的操作。

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

参考您在此处关于SizeChanged事件未触发的评论,这可能是因为您的对象位于 aStackPanel中,它将增长/缩小以适应其子项的大小,而不是与其父项(Grid单元格)的大小相匹配。

您也可以在实际的 UI 对象上使用DataTriggerand来执行此操作Converter,因此它会自动检查模板是否应在控件ActualWidth或更改时ActualHeight更改。

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

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;
}

您可以像这样获得控件的可见性:

ControlVisibility ctrlVisibility = 
    WPFHelpers.IsObjectVisibleInContainer(button, parent);

if (ctrlVisibility == ControlVisibility.Full 
    || isVisible == ControlVisibility.FullWidthPartialHeight)
{
    // Set big template
}
else
{
    // Set little template
}
于 2013-03-19T13:30:39.750 回答
1

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

于 2013-03-19T16:59:31.073 回答