Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MarkdownTextBlock: Adds OnMarkdownParsed event #616

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions components/MarkdownTextBlock/src/MarkdownParsedEventArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using Markdig.Syntax;

namespace CommunityToolkit.Labs.WinUI.MarkdownTextBlock;

public sealed class MarkdownParsedEventArgs : EventArgs
{
public MarkdownDocument Document { get; }
public MarkdownParsedEventArgs(MarkdownDocument document)
{
Document = document;
}
}
19 changes: 19 additions & 0 deletions components/MarkdownTextBlock/src/MarkdownTextBlock.Events.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

namespace CommunityToolkit.Labs.WinUI.MarkdownTextBlock;

partial class MarkdownTextBlock
{
/// <summary>
/// Event raised when a markdown link is clicked.
/// </summary>
public event EventHandler<LinkClickedEventArgs>? OnLinkClicked;

/// <summary>
/// Event raised when markdown is done parsing, with a complete MarkdownDocument.
/// It is always raised before the control renders the document.
/// </summary>
public event EventHandler<MarkdownParsedEventArgs>? OnMarkdownParsed;
}
3 changes: 1 addition & 2 deletions components/MarkdownTextBlock/src/MarkdownTextBlock.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,6 @@ public MarkdownDocument? MarkdownDocument
private set => SetValue(MarkdownDocumentProperty, value);
}

public event EventHandler<LinkClickedEventArgs>? OnLinkClicked;

internal void RaiseLinkClickedEvent(Uri uri) => OnLinkClicked?.Invoke(this, new LinkClickedEventArgs(uri));

private static void OnConfigChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
Expand Down Expand Up @@ -116,6 +114,7 @@ private void ApplyText(bool rerender)
if (!string.IsNullOrEmpty(Text))
{
this.MarkdownDocument = Markdown.Parse(Text, _pipeline);
OnMarkdownParsed?.Invoke(this, new MarkdownParsedEventArgs(this.MarkdownDocument));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe there is a 1-1 relationship between MarkdownTextBlock and its MarkdownDocument, so I would remove the Document property from the MarkdownParsedEventArgs, as you can get that from the sender.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Every time you change the Text property of MarkdownTextBlock, technically you would get a brand new MarkdownDocument tree. If we also move the parsing to another thread, technically there would be no guarantees that the MarkdownDocument currently set on the control is the one corresponding to the given event, especially in streaming contexts

_renderer.Render(this.MarkdownDocument);
}
}
Expand Down
Loading