WPF:确定面板是不是对用户可见

Posted

技术标签:

【中文标题】WPF:确定面板是不是对用户可见【英文标题】:WPF: Determine if a Panel is visible to the userWPF:确定面板是否对用户可见 【发布时间】:2011-07-30 19:37:34 【问题描述】:

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

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

由于重绘操作是一个我只需要在可见选项卡中的控件。

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

PS。

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

【问题讨论】:

可见是什么意思?最重要的是,没有以任何方式被遮挡? 我遇到了同样的问题,我解决了。我在这个线程中写了解决方案:***.com/questions/1517743/… 【参考方案1】:

我发现,虽然 Steve 的方法通常有效,但如果您从子控件中间的某个位置获得一个点,它的工作会更加可靠。我猜想可能是布局舍入沿途某处使 InputHitTest 检查有些不精确。所以,把他的第一行改成下面这样,你就成功了:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

) 比方说,在这里问之前,测试“IsVisible”是可以测试的第一件事。我的元素始终是 IsVisible,这意味着它不是隐藏的,但如果用户可以看到它就不会隐藏,因为它位于“非活动”选项卡中。 感谢第二个链接。不幸的是,我的控件不在 Scrollwiever 中,而是在 TabControl 的选项卡中。 好的,我也测试过了。对于“非活动”选项卡中的元素,此属性为 false。也许你应该重复你的测试? :) 我更改了答案以添加另一个解决方案:) 问题是我使用了WindowsForm选项卡控件。我在 Winforms 应用程序中托管了一个 WPF UserControl。所以 TabControl 是 WinForms 的...【参考方案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);

但是,我应该指出,我自己没有尝试过,并且它可能无法在以下情况下工作:

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

【讨论】:

以上是关于WPF:确定面板是不是对用户可见的主要内容,如果未能解决你的问题,请参考以下文章

WPF学习第八章 Grid面板

WPF 列表框虚拟化面板

如何检查该面板在 JavaScript 中是不是可见?

WPF:尝试根据组合框中的选择更改可见性

WPF学习第七章 WrapPanel和DockPanel面板

C# 在面板上绘图