处理加载的松散 Flowdocument 中的所有超链接 MouseEnter 事件

发布于 2024-10-27 03:38:19 字数 305 浏览 5 评论 0原文

我是 WPF 新手,正在开发我的第一个项目。我已经被这个问题困扰一周了,所以我想在这里寻求一些帮助。

我的应用程序中有一个 FlowDocumentReader,它加载多个 FlowDocument(独立文件作为松散的 xaml 文件)。

我需要处理加载文档中所有超链接的 MouseEnter 事件,但我无法在 XAML 中设置 MouseEnter="myHandler",因为这些是松散的 XAML 文件。

有没有办法解析 FlowDocument 并在加载时设置处理程序?

还有其他解决方案吗?很抱歉新手问题,提前非常感谢。

I'm new to WPF, working on my first project. I've been stuck in this problem for a week so I'm trying to find some help here.

I have a FlowDocumentReader inside my app, wich loads several FlowDocuments (independent files as loose xaml files).

I need to handle the MouseEnter event for all the Hyperlinks in the loaded document but I cannot set MouseEnter="myHandler" in XAML as theese are loose XAML files.

Is there any way to parse de FlowDocument and set the handlers when loading it?

Any other solution? Sorry for the Newbie question, thanks A LOT in advance.

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

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

发布评论

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

评论(2

清风疏影 2024-11-03 03:38:19

加载 FlowDocument 后,您可以使用 LogicalTreeHelper 枚举所有 UIElement。它将允许您找到所有超链接。然后您只需订阅他们的 MouseEnter 事件即可。这是一个代码:

    void SubscribeToAllHyperlinks(object sender, RoutedEventArgs e)
    {
        var hyperlinks = GetVisuals(this).OfType<Hyperlink>();
        foreach (var link in hyperlinks)
            link.MouseEnter += Hyperlink_MouseEnter;
    }

    public static IEnumerable<DependencyObject> GetVisuals(DependencyObject root)
    {
        foreach (var child in LogicalTreeHelper.GetChildren(root).OfType<DependencyObject>())
        {
            yield return child;
            foreach (var descendants in GetVisuals(child))
                yield return descendants;
        }
    }

    private void Hyperlink_MouseEnter(object sender, MouseEventArgs e)
    {
        // Do whatever you want here
    }

我已经使用以下 XAML 对其进行了测试:

<FlowDocumentReader>
    <FlowDocument>
        <Paragraph>
            <Hyperlink>asf</Hyperlink>
        </Paragraph>
    </FlowDocument>
</FlowDocumentReader>

After loading your FlowDocument you can enumerate all UIElements using LogicalTreeHelper. It will allow you to find all hyperlinks. Then you can simply subscribe to their MouseEnter event. Here is a code:

    void SubscribeToAllHyperlinks(object sender, RoutedEventArgs e)
    {
        var hyperlinks = GetVisuals(this).OfType<Hyperlink>();
        foreach (var link in hyperlinks)
            link.MouseEnter += Hyperlink_MouseEnter;
    }

    public static IEnumerable<DependencyObject> GetVisuals(DependencyObject root)
    {
        foreach (var child in LogicalTreeHelper.GetChildren(root).OfType<DependencyObject>())
        {
            yield return child;
            foreach (var descendants in GetVisuals(child))
                yield return descendants;
        }
    }

    private void Hyperlink_MouseEnter(object sender, MouseEventArgs e)
    {
        // Do whatever you want here
    }

I've tested it with following XAML:

<FlowDocumentReader>
    <FlowDocument>
        <Paragraph>
            <Hyperlink>asf</Hyperlink>
        </Paragraph>
    </FlowDocument>
</FlowDocumentReader>
活泼老夫 2024-11-03 03:38:19

看一下 http://xtrememvvm.codeplex.com/

它可以让您直接从松散的事件处理程序中挂钩XAML 文件。

没有文档,但使用路由命令和事件处理程序的示例应用程序演示。

  • 黏土

Take a look at http://xtrememvvm.codeplex.com/

It lets you hook directly into events handlers from loose XAML files.

No docs, but the sample app demos using routed commands and event handlers.

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