【问题标题】:Controlling which items leave a stackpanel's visible area控制哪些项目离开堆栈面板的可见区域
【发布时间】:2013-03-07 23:17:06
【问题描述】:

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

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

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

【问题讨论】:

  • 你能提供更多关于你想要做什么的细节吗?
  • @Xcalibur37 我已经更新了我的问题。
  • 那么,为什么不直接使用 StackPanel 的 SizeChanged 事件并观察它的尺寸呢?
  • 好的,按钮内容周围的容器类型是什么(在分割区域内)?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    通常我向父对象的LoadedSizeChanged 事件添加一个事件,然后从那里确定控件是否可见。如果不是,我将模板更改为模板的较小版本。

    参考your comment here 关于SizeChanged 事件未触发,这可能是因为您将对象放在StackPanel 中,它会增长/缩小以适应其子项的大小,而不是与大小匹配它的父级(Grid 单元格)。

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

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

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2015-11-18
      • 2011-12-19
      • 2011-01-02
      • 2012-08-28
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      相关资源
      最近更新 更多