【问题标题】:How to control placement ordering when using arrangeoverride to extend WPF controls使用arrangeoverride扩展WPF控件时如何控制放置顺序
【发布时间】:2011-01-15 02:05:40
【问题描述】:
我正在扩展 WPF 文本框,以便在其上放置自定义图像。我想捕捉这张图片上的鼠标点击。到目前为止,我已经能够使用arrangeOverride 将图像放置在我需要它的位置,但是由于它恰好被放置在文本框“内部”,每当我尝试单击它时,文本框都会捕获单击和附加到的事件图像不触发。使用排列覆盖时是否可以指示图像应放置在文本框的顶部?我知道如果我扩展一个控件并在其中放置一个文本框,我可以解决这个问题,但是对于我的应用程序,我需要实际扩展一个文本框,以便能够在另一个当前正在使用的更复杂的控件中使用它一个文本框。
谢谢!
【问题讨论】:
标签:
wpf
textbox
controls
extending
【解决方案1】:
ArrangeOverride 可能不是解决此问题的理想解决方案。更好的方法可能是使用控件模板:创建一个包含单个单元格的 Grid 的 ControlTemplate,并将图像和文本框内容宿主放置在该单个单元格中。您可以按照放置控件的顺序将图像隐式放置在顶部,也可以通过设置 Panel.ZIndex 附加属性显式放置。
这里的一个技巧是知道如何表示文本框内容宿主。这必须是一个名为 PART_ContentHost 的 ScrollViewer。所以你的模板看起来像:
<ControlTemplate TargetType="{x:Type Ambog36sTextBox}">
<Grid>
<ScrollViewer x:Name="PART_ContentHost" /> <!-- WPF will fill in a text edit area here -->
<Image Panel.ZIndex="1" Source="..." />
</Grid>
</ControlTemplate>
然后以通常的方式通过默认样式将此模板分配给您的自定义文本框类。
【解决方案2】:
由于您没有使用标准组合模型,这意味着您需要在鼠标处理到达文本框代码之前覆盖鼠标处理,并添加您自己的自定义逻辑来决定要生成的事件。