WPF:如何使用透明画布和可点击子项制作覆盖控件
Posted
技术标签:
【中文标题】WPF:如何使用透明画布和可点击子项制作覆盖控件【英文标题】:WPF: How to make an overlay control with transparent canvas and clickable child 【发布时间】:2011-12-12 05:13:24 【问题描述】:我想制作一个将用作叠加层的自定义控件。该控件应该包含几个子控件,这些子控件应该被绘制并且应该像往常一样可以点击。但控件中的所有其他内容都应该是透明的并且“可点击”。
这是我尝试实现此目的的方法...首先,我在要放置叠加层的窗口中使用 PreviewMouseDown\Up\Move 事件。我希望这些事件“通过”我的自定义控件的透明部分,但在不透明处停止(例如在我的按钮处)。其次,这是我的控件的 xaml(根 UserControl 节点保持不变):
<Canvas Background="transparent" IsHitTestVisible="true">
<Button Canvas.Left="384" Canvas.Top="34" Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click" IsHitTestVisible="True" />
<TextBlock Canvas.Left="27" Canvas.Top="105" Height="36" Name="textBlock1" Text="TextBlock" Width="432" FontSize="24" IsHitTestVisible="False" Foreground="Red" FontWeight="Bold" />
</Canvas>
但是,如果我将 Canvas 的 IsHitTestVisible 设置为 false,则包括按钮在内的整个控件将变为“不可点击”。如果将其设置为 true,我的所有隧道事件都会在自定义控件处停止,并且按钮变得不可点击。
实现这种行为的正确方法是什么? 是否可以在没有子类化画布(或任何其他面板)的情况下这样做?
【问题讨论】:
【参考方案1】:您应该将Canvas
的背景设置为null
(或者只是没有背景,null
是默认设置)。 Transparent
对鼠标点击是“可见的”。
【讨论】:
@Vlad,嗨,很高兴再次见到你!它是否有效,当背景为空时意味着无法单击内部按钮,但是,当背景透明时意味着可以单击按钮? /// 顺便说一句,非常感谢您之前的帮助。我的意思是 TextHighlightBlock 控件(黄色/橙色突出显示颜色)。你帮我做的很快。我公司的很多人告诉我,这项工作做得很好,这个控制是其中的重要组成部分。 @AndreyK.:嗯,没有硬性规定。有背景的面板(白色或红色或透明,无所谓)参与命中测试。所以鼠标事件可以传递到这样的面板。具有null
(即否)背景的面板不参与命中测试过程。对于正常事件,命中测试从内部控件到外部控件(因此即使画布的背景设置为透明,单击按钮也有效),但对于预览事件,反之亦然,这就是 OP 出现问题的原因。跨度>
以上是关于WPF:如何使用透明画布和可点击子项制作覆盖控件的主要内容,如果未能解决你的问题,请参考以下文章