在逻辑或可视树中查找工具提示弹出窗口

2024-01-10

说我有一个ToolTip使用 XAML 中指定的样式,如下所示:

<Button Content="Click me" ToolTip="Likes to be clicked">
    <Button.Resources>
        <Style TargetType="{x:Type ToolTip}" BasedOn="{StaticResource {x:Type ToolTip}}">
            <Setter Property="OverridesDefaultStyle" Value="true" />
            <Setter Property="HasDropShadow" Value="True" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToolTip}">
                        <StackPanel Background="Wheat" Height="200" Width="200">
                            <TextBlock x:Name="TxbTitle" FontSize="24" Text="ToolTip" Background="BurlyWood" />
                            <ContentPresenter />
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Resources>
</Button>

鉴于我有一个参考Button并且那ToolTip正在显示,我怎样才能找到Popup of the ToolTip(然后寻找它的视觉子代,例如TxbTitle)?

Update:

基于普什普拉吉的 https://stackoverflow.com/a/24596864/617658我能够掌握(完整的)视觉树,它看起来像这样:

System.Windows.Controls.Primitives.PopupRoot
  System.Windows.Controls.Decorator
    System.Windows.Documents.NonLogicalAdornerDecorator
      System.Windows.Controls.ToolTip
        System.Windows.Controls.StackPanel
          System.Windows.Controls.TextBlock (TxbTitle)
          System.Windows.Controls.ContentPresenter
            System.Windows.Controls.TextBlock
      System.Windows.Documents.AdornerLayer

在这里我可以找到TxbTitle TextBlock.

(逻辑树是这样的:)

System.Windows.Controls.Primitives.Popup
  System.Windows.Controls.ToolTip
    System.String

然而,pushpraj 的答案是基于我可以掌握ToolTip实例。我得到的是Button仅,并且Button.ToolTip属性返回字符串"Likes to be clicked",不是ToolTip实例。

更具体地说,问题是,我能否掌握ToolTip or the Popup在某种程度上,当我所拥有的就是Button.

(疯狂的想法:有没有办法枚举所有打开的Popups?)


A ToolTip是一种Popup承载工具提示内容

由于弹出窗口托管在单独的窗口中,因此它有自己的逻辑和可视树

以下是工具提示的视觉和逻辑树,供您参考

视觉树

System.Windows.Controls.Primitives.PopupRoot
  System.Windows.Controls.Decorator
    System.Windows.Documents.NonLogicalAdornerDecorator
      System.Windows.Controls.ToolTip

逻辑树

System.Windows.Controls.Primitives.Popup
  System.Windows.Controls.ToolTip

注意:由于弹出窗口有自己的根目录,因此可能无法从主窗口的视觉或逻辑树访问它。

查找工具提示的弹出窗口

我已使用附加属性来查找工具提示的弹出窗口

namespace CSharpWPF
{

    public class ToolTipHelper : DependencyObject
    {
        public static bool GetIsEnabled(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsEnabledProperty);
        }

        public static void SetIsEnabled(DependencyObject obj, bool value)
        {
            obj.SetValue(IsEnabledProperty, value);
        }

        // Using a DependencyProperty as the backing store for IsEnabled.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty IsEnabledProperty =
            DependencyProperty.RegisterAttached("IsEnabled", typeof(bool), typeof(ToolTipHelper), new PropertyMetadata(false,OnEnable));

        private static void OnEnable(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ToolTip t = d as ToolTip;

            DependencyObject parent = t;
            do
            {
                parent = VisualTreeHelper.GetParent(parent);
                if(parent!=null)
                    System.Diagnostics.Debug.Print(parent.GetType().FullName);
            } while (parent != null);

            parent = t;

            do
            {
                //first logical parent is the popup
                parent = LogicalTreeHelper.GetParent(parent);
                if (parent != null)
                    System.Diagnostics.Debug.Print(parent.GetType().FullName);
            } while (parent != null);

        }  
    }
}

xaml

<Button Content="Click me" ToolTip="Likes to be clicked">
    <Button.Resources>
        <Style TargetType="{x:Type ToolTip}" BasedOn="{StaticResource {x:Type ToolTip}}" 
               xmlns:l="clr-namespace:CSharpWPF">
            <Setter Property="OverridesDefaultStyle" Value="true" />
            <Setter Property="HasDropShadow" Value="True" />
            <Setter Property="l:ToolTipHelper.IsEnabled" Value="True"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToolTip}">
                        <StackPanel Background="Wheat" Height="200" Width="200">
                            <TextBlock x:Name="TxbTitle" FontSize="24" Text="ToolTip" Background="BurlyWood" />
                            <ContentPresenter />
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Resources>
</Button>

我已将新创建的附加属性添加到工具提示样式<Setter Property="l:ToolTipHelper.IsEnabled" Value="True"/>

从隐藏代码中检索 ToolTip 实例

如果您无法从 xaml 指定样式或样式模板,则后面的代码是检索工具提示实例的方法

示例代码

    Style style = new Style(typeof(ToolTip), (Style)this.FindResource(typeof(ToolTip)));
    style.Setters.Add(new Setter(ToolTipHelper.IsEnabledProperty, true));
    this.Resources.Add(typeof(ToolTip), style);

上面的代码为工具提示创建了一个样式对象,并添加了一个设置器ToolTipHelper.IsEnabledProperty并将相同的样式注入到窗口的资源中

结果属性改变了处理程序OnEnable将在ToolTipHelper当需要显示工具提示时类。处理程序中的依赖项对象将是您可以进一步操作的实际工具提示实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在逻辑或可视树中查找工具提示弹出窗口 的相关文章

随机推荐

  • 如何正确关闭IPython Notebook?

    如何正确关闭IPython Notebook 目前 我只需关闭浏览器选项卡 然后使用Ctrl C在终端中 不幸的是 两者都没有exit 也不滴答作响Kill kernel upon exit确实有帮助 他们确实杀死了内核 但不退出 iPyt
  • 实体关系 - 弱实体能否作为“一”参与“一对多”关系

    通过以下实体关系结构 我很难弄清楚 LOAN 和 ITEM 实体之间的关系是否有效 LOAN 的弱实体使用部分键 loan dateLeant 以及来自 CUSTOMER 和 ITEM 的主键来形成 LOAN 主键 然而 LOAN 与 IT
  • java执行linux命令

    我试图从 java 代码执行 linux 命令 cat 但它不起作用 Runtime getRuntime exec cat home roman logs 它对于单文件的猫效果很好 Runtime getRuntime exec cat
  • HTTP POST 请求和带有 MIME 附件多部分/相关和 xop 的标头?

    我正在尝试使用 eBay 的 FileTransfer API 上传批量数据交换调用 为了做到这一点 我必须将 xml 请求字符串发布到 eBay 服务器 但 xml 请求包含一个
  • 类型“Microsoft.SqlServer.Types.SqlGeography”同时存在于“Microsoft.SqlServer.Types.dll”和“Microsoft.SqlServer.Types.dll”中

    在我的 Windows 类库 由 MVC 网站使用 中 我安装了 NugetPackageMicrosoft SqlServer Types Spatial 现在 使用 ado net 我尝试通过执行以下操作来读取该值 protected
  • Keras 功能模型提供高验证精度但预测不正确

    我正在尝试使用 PASCAL VOC 2012 数据集上的 ImageNet 预训练权重对 VGG16 架构进行迁移学习 PASCAL VOC 是一个具有 20 个类别的多标签图像数据集 因此我修改了内置的 VGG16 模型 如下所示 de
  • 一个简单的可重现示例,用于在 R 中的自定义函数中将参数传递给 data.table

    我已经用谷歌搜索这个答案几个小时了 很多人都问过类似的问题 但我没有找到足够简单的问题或直接的答案 这是我的方法 假设我想做一个简单的分组data table library data table mtcars data table mtc
  • Java:给定日期的迭代

    我在 Java 中有两个日期 Wed Jan 05 00 00 00 CET 2011 Sat Jan 15 23 59 59 CET 2011 现在我想迭代它们 这样我每天都可以做一个System out println 我在控制台上输入
  • 没有负值的 JSpinner

    我正在 Netbeans 中构建一个小型应用程序 我使用 JSpinner 组件来设置产品的数量 如何将微调器设置为仅取正值 Netbeans 内是否有我可以设置的选择或方法JSpinner EXTRA spinner setModel n
  • 如何在不再次拉取子存储库的情况下进行本地克隆?

    我经常使用 Mercurial 在本地存储我的上游克隆 然后在本地再次克隆以适应我的实际工作环境 cd clones hg clone ssh external repo example com some repo path foo cd
  • 无法在初始渲染中找到参考

    我刚刚在官方文档中读到 第一次渲染时没有调用 componentDidUpdate 我想这可能就是为什么我的这个组件第一次渲染时 dom 没有被定义 这是一个弹出模式 当需要编辑页面时会弹出 我还有其他方法可以解决这个问题吗 compone
  • 将文件移动到新目录的批处理命令

    我想编写一个批处理作业 执行时将抓取所有文件C Test Log文件夹并将它们移至新目录C Test 这个新目录的名称为 Backup 名称为 当前日期 因此 完成后 日志文件夹应该为空 所有文件现在都位于新文件夹中 我知道我必须使用MOV
  • Java:如何获取当前音频输入的频率?

    我想分析麦克风输入的当前频率 以使 LED 与播放的音乐同步 我知道如何从麦克风捕获声音 但我不知道 FFT 这是我在寻找获取频率的解决方案时经常看到的 我想测试一下某个频率的当前音量是否大于设定值 代码应该看起来像这样 if freque
  • 自动扩展 YAML 合并的工具?

    我正在寻找一种工具或流程 可以轻松获取包含锚点 别名和合并键的 YAML 文件 并扩展别名并合并到平面 YAML 文件中 仍有许多常用的 YAML 解析不完全支持合并 我希望能够利用合并来保持干燥 但在某些情况下 需要将其构建到更详细的 平
  • 破损的日食可以修复吗?

    几天后 我不能再使用 Ctrl S 等键盘快捷键 因为它会在我的源代码中插入特殊字符 在属性文件中 我注意到 Ctrl S 插入了 u2308 有没有办法修复此问题 而无需重新安装 STS 2 8 1 您可以尝试使用以下命令从命令行启动 E
  • 如何使用授权和客户端 ID 在 C# 中调用 Azure Maps API?

    我正在尝试使用Azure 地图 API使用坐标搜索某个点周围的 POI 但我不知道如何通过添加以下内容来调用 API授权 and 客户端 ID 这是我在 Microsoft 文档网站上尝试该 API 时收到的请求预览 GET https a
  • 续集“findbyid”不是一个函数,但显然“findAll”是

    我遇到了一个非常奇怪的问题 当我尝试调用函数 findAll 时 它工作正常 创建和销毁相同 但是当我尝试调用函数 findById 时 它会抛出 findById 不是函数 与 FindOne 相同 works fine var gamm
  • model.save_weights 是否包含优化器状态?

    如果是 那么他们是如何做到的 我的意思是 假设我有一个通过子类化定制的模型 我的优化器是一个单独的对象 一个命令如何保存两个不同物体的权重 特别是 它如何知道这两个对象是相关的 是由于 model compile 完成的魔法吗 编辑 我刚刚
  • Laravel 图像提交按钮

    我想知道是否有一种方法可以自定义提交按钮的外观 改为图像 拉拉维尔 3 http three laravel com docs 目前 我的提交按钮代码如下所示 Form open project delete DELETE Form hid
  • 在逻辑或可视树中查找工具提示弹出窗口

    说我有一个ToolTip使用 XAML 中指定的样式 如下所示