Merge branch 'master' into HD-ImageEx

This commit is contained in:
Alexandre Zollinger Chohfi 2018-05-16 14:24:57 -07:00 коммит произвёл GitHub
Родитель 53cfa97652 da110ef5cc
Коммит acc36c9311
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
12 изменённых файлов: 319 добавлений и 90 удалений

Просмотреть файл

@ -12,7 +12,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Toolkit.Extensions;
using Microsoft.Toolkit.Parsers.Markdown.Blocks;
using Microsoft.Toolkit.Parsers.Markdown.Enums;
using Microsoft.Toolkit.Parsers.Markdown.Helpers;
@ -93,6 +95,7 @@ namespace Microsoft.Toolkit.Parsers.Markdown
var paragraphText = new StringBuilder();
// These are needed to parse underline-style header blocks.
int previousRealtStartOfLine = start;
int previousStartOfLine = start;
int previousEndOfLine = start;
@ -150,15 +153,40 @@ namespace Microsoft.Toolkit.Parsers.Markdown
}
else
{
// There were less block quote characters than expected.
// But it doesn't matter if this is not the start of a new paragraph.
if (!lineStartsNewParagraph || nonSpaceChar == '\0')
int lastIndentation = 0;
string lastline = null;
// Determines how many Quote levels were in the last line.
if (realStartOfLine > 0)
{
lastline = markdown.Substring(previousRealtStartOfLine, previousEndOfLine - previousRealtStartOfLine);
lastIndentation = lastline.Count(c => c == '>');
}
var currentEndOfLine = Common.FindNextSingleNewLine(markdown, nonSpacePos, end, out _);
var currentline = markdown.Substring(realStartOfLine, currentEndOfLine - realStartOfLine);
var currentIndentation = currentline.Count(c => c == '>');
var firstChar = markdown[realStartOfLine];
// This is a quote that doesn't start with a Quote marker, but carries on from the last line.
if (lastIndentation == 1)
{
if (nonSpaceChar != '\0' && firstChar != '>')
{
break;
}
}
// Collapse down a level of quotes if the current indentation is greater than the last indentation.
// Only if the last indentation is greater than 1, and the current indentation is greater than 0
if (lastIndentation > 1 && currentIndentation > 0 && currentIndentation < lastIndentation)
{
break;
}
// This must be the end of the blockquote. End the current paragraph, if any.
actualEnd = previousEndOfLine;
actualEnd = realStartOfLine;
if (paragraphText.Length > 0)
{
blocks.Add(ParagraphBlock.Parse(paragraphText.ToString()));
@ -317,6 +345,7 @@ namespace Microsoft.Toolkit.Parsers.Markdown
}
// Repeat.
previousRealtStartOfLine = realStartOfLine;
previousStartOfLine = startOfLine;
previousEndOfLine = endOfLine;
startOfLine = startOfNextLine;

Просмотреть файл

@ -10,12 +10,14 @@
// THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE.
// ******************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Toolkit.Parsers.Markdown;
using Microsoft.Toolkit.Parsers.Markdown.Blocks;
using Microsoft.Toolkit.Parsers.Markdown.Inlines;
using Microsoft.Toolkit.Parsers.Markdown.Render;
using Microsoft.Toolkit.Uwp.Helpers;
using Microsoft.Toolkit.Uwp.UI.Controls.Markdown.Render;
using Windows.ApplicationModel.DataTransfer;
using Windows.UI;
@ -34,6 +36,7 @@ namespace Microsoft.Toolkit.Uwp.SampleApp.Controls
public SampleAppMarkdownRenderer(MarkdownDocument document, ILinkRegister linkRegister, IImageResolver imageResolver, ICodeBlockResolver codeBlockResolver)
: base(document, linkRegister, imageResolver, codeBlockResolver)
{
LanguageRequested += SampleAppMarkdownRenderer_LanguageRequested;
}
/// <summary>
@ -73,53 +76,148 @@ namespace Microsoft.Toolkit.Uwp.SampleApp.Controls
}
var lastIndex = collection.Count() - 1;
var prevIndex = lastIndex - 1;
// Removes the current Code Block UI from the UI Collection, and wraps it in additional UI.
if (collection[lastIndex] is ScrollViewer viewer)
{
collection.RemoveAt(lastIndex);
// Creates a Header to specify Language and provide a copy button.
var headerGrid = new Grid
// Combine Code Blocks if a Different Language.
if (language != "XAML"
&& prevIndex >= 0
&& collection[prevIndex] is StackPanel prevPanel
&& prevPanel.Tag is CustCodeBlock block
&& !block.Languages.ContainsKey("XAML") // Prevent combining of XAML Code Blocks.
&& !block.Languages.ContainsKey(language))
{
Background = new SolidColorBrush(Color.FromArgb(17, 0, 0, 0))
};
headerGrid.ColumnDefinitions.Add(new ColumnDefinition());
headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
// Add New Lang to Existing Block
block.Languages.Add(language, (viewer, element.Text));
var languageBlock = new TextBlock
if (prevPanel.Children.FirstOrDefault() is Grid headerGrid)
{
var langHead = headerGrid.Children.FirstOrDefault();
if (langHead is TextBlock textLangHead)
{
// Replace TextBlock with ComboBox
headerGrid.Children.Remove(textLangHead);
var combLangHead = new ComboBox
{
Items =
{
textLangHead.Text,
language
},
SelectedIndex = 0,
MinWidth = 80
};
headerGrid.Children.Add(combLangHead);
combLangHead.SelectionChanged += (s, e) =>
{
var newLang = combLangHead.SelectedItem as string;
block.CurrentLanguage = newLang;
LanguageRequested?.Invoke(combLangHead, newLang);
var newViewer = block.Languages[newLang].viewer;
// Remove old Viewer.
var lastItem = prevPanel.Children.Count - 1;
if (lastItem >= 0)
{
prevPanel.Children.RemoveAt(lastItem);
}
prevPanel.Children.Add(newViewer);
};
LanguageRequested += (s, e) =>
{
if (s != combLangHead)
{
if (combLangHead.Items.Contains(e))
{
combLangHead.SelectedItem = e;
block.CurrentLanguage = e;
}
}
};
if (DesiredLang == language)
{
combLangHead.SelectedItem = language;
block.CurrentLanguage = language;
}
}
else if (langHead is ComboBox combLangHead)
{
// Add Lang to ComboBox
block.Languages.Add(language, (viewer, element.Text));
combLangHead.Items.Add(language);
if (DesiredLang == language)
{
combLangHead.SelectedItem = language;
block.CurrentLanguage = language;
}
}
}
}
else
{
Text = language,
VerticalAlignment = VerticalAlignment.Center,
Margin = new Thickness(10, 0, 0, 0)
};
headerGrid.Children.Add(languageBlock);
block = new CustCodeBlock();
block.Languages.Add(language, (viewer, element.Text));
block.CurrentLanguage = language;
var copyButton = new Button
{
Content = "Copy",
HorizontalAlignment = HorizontalAlignment.Stretch,
VerticalAlignment = VerticalAlignment.Stretch
};
// Creates a Header to specify Language and provide a copy button.
var headerGrid = new Grid
{
Background = new SolidColorBrush(Color.FromArgb(17, 0, 0, 0))
};
headerGrid.ColumnDefinitions.Add(new ColumnDefinition());
headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
copyButton.Click += (s, e) =>
{
var content = new DataPackage();
content.SetText(element.Text);
Clipboard.SetContent(content);
};
var languageBlock = new TextBlock
{
Text = language,
VerticalAlignment = VerticalAlignment.Center,
Margin = new Thickness(10, 0, 0, 0)
};
headerGrid.Children.Add(languageBlock);
headerGrid.Children.Add(copyButton);
Grid.SetColumn(copyButton, 1);
var copyButton = new Button
{
Content = "Copy",
HorizontalAlignment = HorizontalAlignment.Stretch,
VerticalAlignment = VerticalAlignment.Stretch
};
// Collection the adornment and the standard UI, add them to a Stackpanel, and add it back to the collection.
var panel = new StackPanel();
panel.Children.Add(headerGrid);
panel.Children.Add(viewer);
panel.Background = viewer.Background;
panel.Margin = viewer.Margin;
copyButton.Click += (s, e) =>
{
var text = block.Languages[block.CurrentLanguage].text;
collection.Add(panel);
var content = new DataPackage();
content.SetText(text);
Clipboard.SetContent(content);
};
headerGrid.Children.Add(copyButton);
Grid.SetColumn(copyButton, 1);
// Collection the adornment and the standard UI, add them to a Stackpanel, and add it back to the collection.
var panel = new StackPanel
{
Background = viewer.Background,
Margin = viewer.Margin,
Tag = block
};
panel.Children.Add(headerGrid);
panel.Children.Add(viewer);
collection.Add(panel);
}
}
}
@ -243,8 +341,47 @@ namespace Microsoft.Toolkit.Uwp.SampleApp.Controls
}
}
/// <summary>
/// Sets the Desired Language for the Sample App.
/// </summary>
/// <param name="sender">Language Combobox</param>
/// <param name="e">New Language</param>
private void SampleAppMarkdownRenderer_LanguageRequested(object sender, string e)
{
DesiredLang = e;
}
/// <summary>
/// The Note Glyph.
/// </summary>
private const string NoteGlyph = "\uE946";
/// <summary>
/// The Key for Settings.
/// </summary>
private const string DesiredLangKey = "Docs-DesiredLang";
/// <summary>
/// Gets or sets the Desired Language from Settings.
/// </summary>
public string DesiredLang
{
get
{
return storage.Read<string>(DesiredLangKey);
}
set
{
storage.Save(DesiredLangKey, value);
}
}
/// <summary>
/// The Local Storage Helper.
/// </summary>
private LocalObjectStorageHelper storage = new LocalObjectStorageHelper();
/// <summary>
/// DocFX note types and styling info.
/// </summary>
@ -284,6 +421,11 @@ namespace Microsoft.Toolkit.Uwp.SampleApp.Controls
}
};
/// <summary>
/// The Event if a Language change is requested.
/// </summary>
public event EventHandler<string> LanguageRequested;
/// <summary>
/// Identification and styles related to each Note type.
/// </summary>
@ -301,5 +443,15 @@ namespace Microsoft.Toolkit.Uwp.SampleApp.Controls
public SolidColorBrush DarkBackground { get; set; }
}
/// <summary>
/// Code Block Tag Information to track current Language and Alternate Views.
/// </summary>
private class CustCodeBlock
{
public Dictionary<string, (FrameworkElement viewer, string text)> Languages { get; } = new Dictionary<string, (FrameworkElement viewer, string text)>();
public string CurrentLanguage { get; set; }
}
}
}

Просмотреть файл

@ -396,27 +396,55 @@ which renders in:
You'll probably do a lot of quoting of other redditors. In those cases, you'll want to use block quotes. Simple begin each line you want quoted with a right angle bracket (>). Multiple angle brackets can be used for nested quotes. To cause a new paragraph to be quoted, begin that paragraph with another angle bracket. So the following:
>Here's a quote.
>Another paragraph in the same quote.
>>A nested quote.
>Quote1
>Back to a single quote.
>Quote2.1
>>Quote2.Nest1.1
>>
>>Quote2.Nest1.2
>
>Quote2.3
And finally some unquoted text.
>Quote3.1
>Quote3.2
>Quote4.1
>
>Quote4.2
>Quote5.1
Quote5.2
>Quote6
Plain text.
Is displayed as:
>Here's a quote.
>Another paragraph in the same quote.
>>A nested quote.
>Quote1
>Back to a single quote.
>Quote2.1
>>Quote2.Nest1.1
>>
>>Quote2.Nest1.2
>
>Quote2.3
And finally some unquoted text.
>Quote3.1
>Quote3.2
>Quote4.1
>
>Quote4.2
>Quote5.1
Quote5.2
>Quote6
Plain text.
*****

Просмотреть файл

@ -9,9 +9,35 @@
mc:Ignorable="d">
<Grid>
<StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBox PlaceholderText="Enter String" HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="InputTextBox" MinWidth="300" />
<TextBlock x:Name="IsValid" Padding="0,5"/>
<StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10">
<TextBox PlaceholderText="Enter String" HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="InputTextBox" MinWidth="300" TextChanged="OnTextChanged" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock HorizontalAlignment="Right" Padding="5,0" Grid.Column="0" Grid.Row="0">IsValidEmail</TextBlock>
<TextBlock Grid.Column="1" Grid.Row="0" x:Name="IsValidEmailResult" Foreground="Blue" />
<TextBlock HorizontalAlignment="Right" Padding="5,0" Grid.Column="0" Grid.Row="1">IsValidNumber</TextBlock>
<TextBlock Grid.Column="1" Grid.Row="1" x:Name="IsValidNumberResult" Foreground="Blue" />
<TextBlock HorizontalAlignment="Right" Padding="5,0" Grid.Column="0" Grid.Row="2">IsValidDecimal</TextBlock>
<TextBlock Grid.Column="1" Grid.Row="2" x:Name="IsValidDecimalResult" Foreground="Blue" />
<TextBlock HorizontalAlignment="Right" Padding="5,0" Grid.Column="0" Grid.Row="3">IsValidString</TextBlock>
<TextBlock Grid.Column="1" Grid.Row="3" x:Name="IsValidStringResult" Foreground="Blue" />
<TextBlock HorizontalAlignment="Right" Padding="5,0" Grid.Column="0" Grid.Row="4">IsValidPhoneNumber</TextBlock>
<TextBlock Grid.Column="1" Grid.Row="4" x:Name="IsValidPhoneNumberResult" Foreground="Blue" />
</Grid>
</StackPanel>
</Grid>
</Page>

Просмотреть файл

@ -11,8 +11,8 @@
// ******************************************************************
using Microsoft.Toolkit.Extensions;
using Windows.UI.Text;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
namespace Microsoft.Toolkit.Uwp.SampleApp.SamplePages
{
@ -24,34 +24,30 @@ namespace Microsoft.Toolkit.Uwp.SampleApp.SamplePages
public StringExtensionsPage()
{
this.InitializeComponent();
ValidateCurrentText();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
private void OnTextChanged(object sender, TextChangedEventArgs e)
{
Shell.Current.RegisterNewCommand("Is Valid Email?", (s, a) =>
{
IsValid.Text = string.Format("IsValid: {0}", InputTextBox.Text.IsEmail());
});
ValidateCurrentText();
}
Shell.Current.RegisterNewCommand("Is Valid Number?", (s, a) =>
{
IsValid.Text = string.Format("IsValid: {0}", InputTextBox.Text.IsNumeric());
});
private void ValidateCurrentText()
{
IsValidEmailResult.Text = InputTextBox.Text.IsEmail().ToString();
IsValidEmailResult.FontWeight = InputTextBox.Text.IsEmail() ? FontWeights.Bold : FontWeights.Normal;
Shell.Current.RegisterNewCommand("Is Valid Decimal?", (s, a) =>
{
IsValid.Text = string.Format("IsValid: {0}", InputTextBox.Text.IsDecimal());
});
IsValidNumberResult.Text = InputTextBox.Text.IsNumeric().ToString();
IsValidNumberResult.FontWeight = InputTextBox.Text.IsNumeric() ? FontWeights.Bold : FontWeights.Normal;
Shell.Current.RegisterNewCommand("Is Valid String?", (s, a) =>
{
IsValid.Text = string.Format("IsValid: {0}", InputTextBox.Text.IsCharacterString());
});
IsValidDecimalResult.Text = InputTextBox.Text.IsDecimal().ToString();
IsValidDecimalResult.FontWeight = InputTextBox.Text.IsDecimal() ? FontWeights.Bold : FontWeights.Normal;
Shell.Current.RegisterNewCommand("Is Valid PhoneNumber?", (s, a) =>
{
IsValid.Text = string.Format("IsValid: {0}", InputTextBox.Text.IsPhoneNumber());
});
IsValidStringResult.Text = InputTextBox.Text.IsCharacterString().ToString();
IsValidPhoneNumberResult.FontWeight = InputTextBox.Text.IsCharacterString() ? FontWeights.Bold : FontWeights.Normal;
IsValidPhoneNumberResult.Text = InputTextBox.Text.IsPhoneNumber().ToString();
IsValidPhoneNumberResult.FontWeight = InputTextBox.Text.IsPhoneNumber() ? FontWeights.Bold : FontWeights.Normal;
}
}
}

Просмотреть файл

@ -32,7 +32,7 @@ Some warning note
```csharp
```
<!-- VB.Net samples are optional. If included, 'vb' should also be listed in the 'dev_langs' defined in the header
<!-- VB.Net samples are optional. If included, 'vb' should also be listed in the 'dev_langs' defined in the header. Code Blocks will be combined if there is no other content between different Code Block languages.
```vb
```

Просмотреть файл

@ -227,7 +227,7 @@ The HamburgerMenu and NavigationView share the same concepts and provide the sam
settingsItem.Icon = New FontIcon() With {.Glyph = "?"}
```
- Free-form content in the panes footer, by adding any content in the new *PaneFooter* property
- Free-form content in the pane's footer, by adding any content in the new *PaneFooter* property
In addition, the NavigationView introduces new classes for quickly adding navigation items and grouping items. You can use the new NavigationViewItem, NavigationViewItemSeparator and NavigationViewItemHeader to directly populate the MenuItems and get the look you want
@ -246,8 +246,6 @@ Version 3.0 of the Windows Community Toolkit adds another related property calle
> [!NOTE]
The `ItemClick` and `OptionsItemClick` events will continue to work but the EventArgs will be null when `UseNavigationViewWhenPossible` is set to true. There is a new event called `ItemInvoked` that should be used instead. This new event will include information about the clicked item and whether it is an item or options item. This event also works if UseNavigationViewWhenPossible is set to false.
*****
> [!NOTE]
The PaneBackground will not have any effect when `UseNavigationViewWhenPossible` is set to null. To change the pane background of the NavigationView, modify the two theme resources by overwriting them in your App.xaml. See the [NavigationVew documentation](https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/navigationview#customizing-backgrounds) for more details.

Просмотреть файл

@ -9,7 +9,7 @@ keywords: windows 10, uwp, windows community toolkit, uwp community toolkit, uwp
The [MarkdownTextBlock control](https://docs.microsoft.com/dotnet/api/microsoft.toolkit.uwp.ui.controls.markdowntextblock) provides full markdown parsing and rendering for Universal Windows Apps. Originally created for the open source reddit app Baconit, the control was engineered to be simple to use and very efficient. One of the main design considerations for the control was it needed to be performant enough to provide a great user experience in virtualized lists. With the custom markdown parser and efficient XAML rendering, we were able to achieve excellent performance; providing a smooth UI experience even with complex Markdown on low end hardware.
Under the hood, the control uses XAML sub elements to build the visual rendering tree for the Markdown input. We chose to use full XAML elements over using the RichEditTextBlock control because the RichEditTextBlock isnt flexible enough to correctly render all of the standard Markdown styles.
Under the hood, the control uses XAML sub elements to build the visual rendering tree for the Markdown input. We chose to use full XAML elements over using the RichEditTextBlock control because the RichEditTextBlock isn't flexible enough to correctly render all of the standard Markdown styles.
## Syntax

Просмотреть файл

@ -114,7 +114,7 @@ Private Sub SlidableListItem_SwipeStatusChanged(ByVal sender As SlidableListItem
End Sub
```
If you use `SlidableListItem` in a `ListView` with the `ItemClick` event, you need to be aware the `ItemClick` event is triggered by default when the control has been swiped. If you dont want this behavior you can set `IsPointerReleasedOnSwipingHandled` to `true` to suppress the `ItemClick` event. If you need more control you can instead check the `SwipeStatus` property in the `ItemClick` event. The following code shows how to do that:
If you use `SlidableListItem` in a `ListView` with the `ItemClick` event, you need to be aware the `ItemClick` event is triggered by default when the control has been swiped. If you don't want this behavior you can set `IsPointerReleasedOnSwipingHandled` to `true` to suppress the `ItemClick` event. If you need more control you can instead check the `SwipeStatus` property in the `ItemClick` event. The following code shows how to do that:
```csharp
private void ListView_ItemClick(object sender, ItemClickEventArgs e)

Просмотреть файл

@ -41,7 +41,7 @@ End Function)
Await CoreApplication.MainView.Dispatcher.AwaitableRunAsync(Of T)(Function()
End Function)
``
```
## Methods
@ -106,4 +106,3 @@ End Function)
## API
* [DispatcherHelper source code](https://github.com/Microsoft/UWPCommunityToolkit/blob/master/Microsoft.Toolkit.Uwp/Helpers/DispatcherHelper.cs)

Просмотреть файл

@ -107,6 +107,7 @@ if (!await OneDriveService.Instance.LoginAsync())
If Not Await OneDriveService.Instance.LoginAsync() Then
Throw New Exception("Unable to sign in")
End If
```
### Retrieve the root of your OneDrive

Просмотреть файл

@ -71,13 +71,13 @@ Once you search you should see a list similar to the one below (versions may be
* [Scale](https://docs.microsoft.com/windows/uwpcommunitytoolkit/animations/Scale/)
### Brushes
* [BackdropBlurBrush](http://docs.uwpcommunitytoolkit.com/en/master/brushes/BackdropBlurBrush/)
* [BackdropGammaTransferBrush](http://docs.uwpcommunitytoolkit.com/en/master/brushes/BackdropGammaTransferBrush/)
* [BackdropInvertBrush](http://docs.uwpcommunitytoolkit.com/en/master/brushes/BackdropInvertBrush/)
* [BackdropSaturationBrush](http://docs.uwpcommunitytoolkit.com/en/master/brushes/BackdropSaturationBrush/)
* [BackdropSepiaBrush](http://docs.uwpcommunitytoolkit.com/en/master/brushes/BackdropSepiaBrush/)
* [ImageBlendBrush](http://docs.uwpcommunitytoolkit.com/en/master/brushes/ImageBlendBrush/)
* [RadialGradientBrush](http://docs.uwpcommunitytoolkit.com/en/master/brushes/RadialGradientBrush/)
* [BackdropBlurBrush](https://docs.microsoft.com/windows/uwpcommunitytoolkit/brushes/BackdropBlurBrush/)
* [BackdropGammaTransferBrush](https://docs.microsoft.com/windows/uwpcommunitytoolkit/brushes/BackdropGammaTransferBrush/)
* [BackdropInvertBrush](https://docs.microsoft.com/windows/uwpcommunitytoolkit/brushes/BackdropInvertBrush/)
* [BackdropSaturationBrush](https://docs.microsoft.com/windows/uwpcommunitytoolkit/brushes/BackdropSaturationBrush/)
* [BackdropSepiaBrush](https://docs.microsoft.com/windows/uwpcommunitytoolkit/brushes/BackdropSepiaBrush/)
* [ImageBlendBrush](https://docs.microsoft.com/windows/uwpcommunitytoolkit/brushes/ImageBlendBrush/)
* [RadialGradientBrush](https://docs.microsoft.com/windows/uwpcommunitytoolkit/brushes/RadialGradientBrush/)
### Controls
* [AdaptiveGridView](https://docs.microsoft.com/windows/uwpcommunitytoolkit/controls/AdaptiveGridView/)
@ -120,7 +120,7 @@ Once you search you should see a list similar to the one below (versions may be
* [ListViewExtensions](https://docs.microsoft.com/windows/uwpcommunitytoolkit/extensions/ListViewBase/)
* [LogicalTree](https://docs.microsoft.com/windows/uwpcommunitytoolkit/extensions/LogicalTree/)
* [MouseCursor](https://docs.microsoft.com/windows/uwpcommunitytoolkit/extensions/MouseCursor/)
* [NavigationView Styles](https://docs.uwpcommunitytoolkit.com/windows/uwpcommunitytoolkit/extensions/NavigationView/)
* [NavigationView Styles](https://docs.microsoft.com/windows/uwpcommunitytoolkit/extensions/NavigationView/)
* [ScrollViewerExtensions](https://docs.microsoft.com/windows/uwpcommunitytoolkit/extensions/ScrollViewerExtensions/)
* [SurfaceDialTextbox](https://docs.microsoft.com/windows/uwpcommunitytoolkit/extensions/SurfaceDialTextboxHelper/)
* [TextBoxMask](https://docs.microsoft.com/windows/uwpcommunitytoolkit/extensions/TextBoxMask/)