WPF:确定Panel是否对用户可见

时间:2011-04-06 12:56:49

标签: wpf wpf-controls

我在选项卡(WPF应用程序)中有一个WPF usercontrol(myGraphicControl)。

当表单大小发生变化时,我会在myGraphicControl中重绘图形。

由于重绘操作是我需要只在可见选项卡中进行控制。

WPF(用户)控件如何检测它是否“可见”?

PS。

by Visible我的意思是用户可以看到它。 比如说,如果Visible TextBox位于当前不可见的选项卡中,则该文本框不会被用户看到。

3 个答案:

答案 0 :(得分:3)

我不相信这里有快速解决方案,但您可以使用UIElement.InputHitTest(Point)执行某些操作。

您可以拨打类似

的电话
//get the coordinates of the top left corner of the child control within
//the parent
var childTopLeft = childControl.TranslatePoint(new Point(), parentControl);
//check whether or not the child control is returned when you request the element
//at that coordinate through hit testing
var isVisible = (parentControl.InputHitTest(childTopLeft) == childControl);

但是,我应该指出,我自己并没有尝试过,而且在以下情况下它可能不起作用:

  • 透明项目 - 通常,透明背景会导致控件的命中测试传递给父
  • 部分遮挡的项目 - 您一次只能测试一个点,因此如果只有部分孩子控件可见,则必须检查正确的点

答案 1 :(得分:2)

我发现虽然史蒂夫的方法通常有效,但如果你从儿童控制中间某处得到一个点,它的效果会更加可靠。我猜测沿途某处的布局舍入可能会使InputHitTest检查有些不准确。所以,将他的第一行更改为以下内容,你就是金色的:

var childTopLeft = childControl.TranslatePoint(new Point(childControl.RenderSize.Width/2, childControl.RenderSize.Height/2), parentControl);

答案 2 :(得分:1)

也许UIElement.IsVisible会有所帮助?它适用于标签内容。 无论如何,您可以使用here描述的解决方案。

我还有一个解决方案。 TabControl的当前实现从可视树中删除非活动选项卡。因此,确定元素是否可见的另一种方法是查找PresentationSource。对于非活动选项卡的元素,它将为null。