控制哪些项离开stackpanel的可见区域

本文关键字:区域 stackpanel 离开 控制 | 更新日期: 2023-09-27 18:04:42

是否有一种方法可以控制哪些项目在调整大小时离开堆栈面板的可见区域?
由于


更新1我有一个固定数量的按钮内堆叠面板。当调整堆叠面板的可见区域大小时,每个按钮会根据可用空间自动隐藏或显示。我想实现的是,通过一些事件,控制按钮隐藏或显示当stackpanel调整大小发生。

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

控制哪些项离开stackpanel的可见区域

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

通常,我将一个事件添加到父对象的LoadedSizeChanged事件中,并从中找出控件是否可见。如果不是,我将模板更改为模板的较小版本。

参考您在这里关于SizeChanged事件未触发的评论,这可能是因为您在StackPanel中有您的对象,它将增长/缩小以适合它的孩子的大小,而不是匹配它的父(Grid单元格)的大小。

你可能也可以在实际的UI对象上使用DataTriggerConverter来做到这一点,所以当控件的ActualWidthActualHeight改变时,它会自动检查模板是否应该改变。

我有一个辅助类,我用它来确定一个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
}

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