使用排列覆盖扩展 WPF 控件时如何控制放置顺序

发布于 2024-08-21 16:58:20 字数 265 浏览 8 评论 0原文

我正在扩展 WPF 文本框,以便在其上放置自定义图像。我想捕获鼠标在此图像上的点击。到目前为止,我已经能够使用arrangeOverride将图像放置在我需要的位置,但由于它恰好放置在文本框的“内部”,每当我尝试单击它时,文本框都会捕获单击和附加的事件图像不触发。使用排列覆盖时是否可以指示图像应放置在文本框的顶部?我知道如果我扩展一个控件并在其中放置一个文本框,我可以解决这个问题,但对于我的应用程序,我需要实际扩展一个文本框,以便能够在当前正在使用的另一个更复杂的控件中使用它一个文本框。

谢谢!

I am extending the WPF textbox in order to place a custom image on it. I want to capture mouse clicks on this image. So far i have been able to use arrangeOverride to place the image in where i need it but since it happens to be placed "inside" the text box, whenever i try clicking it the text box captures the click and the event that is attached to the image does not fire. Is it possible to indicate that the image should be placed on top of the text box when using arrange override? I know i can get around this issue if i extended a Control and placed a text box inside it, but for my application i need to actually extend a text box in order to be able to use it in another more complex control that is currently using a text box.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

剩余の解释 2024-08-28 16:58:20

ArrangeOverride 可能不是这个问题的理想解决方案。更好的方法可能是使用控件模板:创建一个包含带有单个单元格的网格的 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>

然后以通常的方式通过默认样式将此模板分配给您的自定义文本框类。

ArrangeOverride may not be the ideal solution for this. A better approach would probably be to use control templating: create a ControlTemplate containing a Grid with a single cell, and place the Image and the text box content host in that single cell. You can place the Image on top implicitly by the order you place the controls, or explicitly by setting the Panel.ZIndex attached property.

The one trick here is knowing how to represent the text box content host. This has to be a ScrollViewer with the name PART_ContentHost. So your template will look something like:

<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>

Then assign this template to your custom text box class via the default style in the usual way.

硬不硬你别怂 2024-08-28 16:58:20

由于您没有使用标准组合模型,这意味着您需要在鼠标到达文本框代码之前覆盖鼠标处理,并添加您自己的自定义逻辑来决定要生成的事件。

As you are not using the standard composition model it means you need to override the mouse handling before it reaches the text box code and add your own custom logic to decide on the events to generate.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文