port chevron animation & click handling; use WCT styling

This commit is contained in:
Carlos Zamora
2026-05-18 17:36:50 -07:00
parent 96d0762a77
commit e60562d99d
5 changed files with 157 additions and 167 deletions

View File

@@ -135,13 +135,30 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
void SettingContainer::_UpdateHelpText()
{
const auto helpText{ HelpText() };
// Forward HelpText into the SettingsCard / SettingsExpander Description
// slot so it renders through the WCT-ported PART_DescriptionPresenter.
// Setting it to nullptr when empty collapses the description visually so we don't
// reserve vertical space for a blank line.
const auto description{ helpText.empty() ? Windows::Foundation::IInspectable{ nullptr } : box_value(helpText) };
// Get the correct base to apply automation properties to
std::vector<DependencyObject> base;
base.reserve(2);
base.reserve(3);
if (const auto& child{ GetTemplateChild(L"Card") })
{
if (const auto& card{ child.try_as<Editor::SettingsCard>() })
{
card.Description(description);
base.push_back(child);
}
}
if (const auto& child{ GetTemplateChild(L"Expander") })
{
if (const auto& expander{ child.try_as<Editor::SettingsExpander>() })
{
expander.Description(description);
base.push_back(child);
}
}
@@ -161,7 +178,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
Automation::AutomationProperties::SetName(obj, _GenerateAccessibleName());
// apply help text as tooltip and full description (automation property)
if (const auto& helpText{ HelpText() }; !helpText.empty())
if (!helpText.empty())
{
Automation::AutomationProperties::SetFullDescription(obj, helpText);
}
@@ -171,15 +188,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
Automation::AutomationProperties::SetFullDescription(obj, L"");
}
}
const auto textBlockHidden = HelpText().empty();
if (const auto& child{ GetTemplateChild(L"HelpTextBlock") })
{
if (const auto& textBlock{ child.try_as<Controls::TextBlock>() })
{
textBlock.Visibility(textBlockHidden ? Visibility::Collapsed : Visibility::Visible);
}
}
}
void SettingContainer::OnApplyTemplate()
@@ -229,14 +237,21 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
void SettingContainer::_UpdateHeaderIcon()
{
Controls::IconElement icon{ nullptr };
if (const auto glyph{ FontIconGlyph() }; !glyph.empty())
// Only forward FontIconGlyph into HeaderIcon when the caller actually
// supplied a glyph. Some templates (Warning/Error) already set
// SettingsCard.HeaderIcon in XAML to a stacked severity glyph; if we
// unconditionally wrote nullptr here we'd clobber that XAML default for
// every callsite that doesn't set FontIconGlyph.
const auto glyph{ FontIconGlyph() };
if (glyph.empty())
{
Controls::FontIcon fi;
fi.Glyph(glyph);
icon = fi;
return;
}
Controls::FontIcon fi;
fi.Glyph(glyph);
const Controls::IconElement icon{ fi };
if (const auto& cardChild{ GetTemplateChild(L"Card") })
{
if (const auto& card{ cardChild.try_as<Editor::SettingsCard>() })

View File

@@ -29,16 +29,6 @@
<StaticResource x:Key="SettingContainerWarningSeverityIconBackground"
ResourceKey="SystemFillColorCautionBrush" />
<StaticResource x:Key="SettingContainerErrorSeverityIconForeground"
ResourceKey="TextFillColorInverseBrush" />
<StaticResource x:Key="SettingContainerWarningSeverityIconForeground"
ResourceKey="TextFillColorInverseBrush" />
<StaticResource x:Key="SettingContainerTitleForeground"
ResourceKey="TextFillColorPrimaryBrush" />
<StaticResource x:Key="SettingContainerMessageForeground"
ResourceKey="TextFillColorPrimaryBrush" />
<StaticResource x:Key="SettingContainerResetButtonIconForeground"
ResourceKey="SystemAccentColorDark2" />
</ResourceDictionary>
@@ -58,16 +48,6 @@
<StaticResource x:Key="SettingContainerWarningSeverityIconBackground"
ResourceKey="SystemColorHighlightColorBrush" />
<StaticResource x:Key="SettingContainerErrorSeverityIconForeground"
ResourceKey="SystemColorHighlightTextColorBrush" />
<StaticResource x:Key="SettingContainerWarningSeverityIconForeground"
ResourceKey="SystemColorHighlightTextColorBrush" />
<StaticResource x:Key="SettingContainerTitleForeground"
ResourceKey="SystemColorWindowTextColorBrush" />
<StaticResource x:Key="SettingContainerMessageForeground"
ResourceKey="SystemColorWindowTextColorBrush" />
<StaticResource x:Key="SettingContainerResetButtonIconForeground"
ResourceKey="SystemAccentColorLight1" />
</ResourceDictionary>
@@ -89,28 +69,14 @@
<StaticResource x:Key="SettingContainerWarningSeverityIconBackground"
ResourceKey="SystemFillColorCautionBrush" />
<StaticResource x:Key="SettingContainerErrorSeverityIconForeground"
ResourceKey="TextFillColorInverseBrush" />
<StaticResource x:Key="SettingContainerWarningSeverityIconForeground"
ResourceKey="TextFillColorInverseBrush" />
<StaticResource x:Key="SettingContainerTitleForeground"
ResourceKey="TextFillColorPrimaryBrush" />
<StaticResource x:Key="SettingContainerMessageForeground"
ResourceKey="TextFillColorPrimaryBrush" />
<StaticResource x:Key="SettingContainerResetButtonIconForeground"
ResourceKey="SystemAccentColorLight2" />
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
<FontWeight x:Key="SettingContainerTitleFontWeight">SemiBold</FontWeight>
<x:String x:Key="SettingContainerIconBackgroundGlyph">&#xF136;</x:String>
<x:String x:Key="SettingContainerErrorIconGlyph">&#xF13D;</x:String>
<x:String x:Key="SettingContainerWarningIconGlyph">&#xF13C;</x:String>
<Thickness x:Key="SettingContainerIconMargin">0,4,8,4</Thickness>
<x:Double x:Key="SettingContainerIconFontSize">16</x:Double>
<Style x:Key="SettingContainerResetButtonStyle"
@@ -176,9 +142,10 @@
<local:SettingsCard x:Name="Card"
Content="{TemplateBinding Content}">
<local:SettingsCard.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource SettingsPageItemHeaderStyle}"
Text="{TemplateBinding Header}" />
<StackPanel VerticalAlignment="Center"
Orientation="Horizontal">
<ContentControl Content="{TemplateBinding Header}"
IsTabStop="False" />
<Button x:Name="ResetButton"
Style="{StaticResource SettingContainerResetButtonStyle}">
<FontIcon Glyph="&#xE845;"
@@ -186,11 +153,6 @@
</Button>
</StackPanel>
</local:SettingsCard.Header>
<local:SettingsCard.Description>
<TextBlock x:Name="HelpTextBlock"
Style="{StaticResource SettingsPageItemDescriptionStyle}"
Text="{TemplateBinding HelpText}" />
</local:SettingsCard.Description>
</local:SettingsCard>
</ControlTemplate>
</Setter.Value>
@@ -207,13 +169,12 @@
<Setter.Value>
<ControlTemplate TargetType="local:SettingContainer">
<local:SettingsExpander x:Name="Expander"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
IsExpanded="{TemplateBinding StartExpanded}">
<local:SettingsExpander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource SettingsPageItemHeaderStyle}"
Text="{TemplateBinding Header}" />
<StackPanel VerticalAlignment="Center"
Orientation="Horizontal">
<ContentControl Content="{TemplateBinding Header}"
IsTabStop="False" />
<Button x:Name="ResetButton"
Style="{StaticResource SettingContainerResetButtonStyle}">
<FontIcon Glyph="&#xE845;"
@@ -221,13 +182,9 @@
</Button>
</StackPanel>
</local:SettingsExpander.Header>
<local:SettingsExpander.Description>
<TextBlock x:Name="HelpTextBlock"
Style="{StaticResource SettingsPageItemDescriptionStyle}"
Text="{TemplateBinding HelpText}" />
</local:SettingsExpander.Description>
<local:SettingsExpander.Content>
<ContentControl MaxWidth="248"
HorizontalAlignment="Right"
VerticalAlignment="Center"
HorizontalContentAlignment="Right"
Content="{TemplateBinding CurrentValue}"
@@ -254,41 +211,18 @@
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:SettingContainer">
<local:SettingsCard Background="{ThemeResource SettingContainerWarningSeverityBackgroundBrush}">
<local:SettingsCard x:Name="Card"
Background="{ThemeResource SettingContainerWarningSeverityBackgroundBrush}">
<local:SettingsCard.Header>
<StackPanel Orientation="Horizontal">
<Grid>
<TextBlock x:Name="IconBackground"
Grid.Column="0"
Margin="{StaticResource SettingContainerIconMargin}"
VerticalAlignment="Center"
AutomationProperties.AccessibilityView="Raw"
FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="{StaticResource SettingContainerIconFontSize}"
Foreground="{ThemeResource SettingContainerWarningSeverityIconBackground}"
Text="{StaticResource SettingContainerIconBackgroundGlyph}" />
<TextBlock x:Name="StandardIcon"
Grid.Column="0"
Margin="{StaticResource SettingContainerIconMargin}"
VerticalAlignment="Center"
FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="{StaticResource SettingContainerIconFontSize}"
Foreground="{ThemeResource SettingContainerWarningSeverityIconForeground}"
Text="{StaticResource SettingContainerWarningIconGlyph}" />
</Grid>
<TextBlock VerticalAlignment="Center"
FontWeight="{StaticResource SettingContainerTitleFontWeight}"
Foreground="{ThemeResource SettingContainerTitleForeground}"
Style="{StaticResource SettingsPageItemHeaderStyle}"
Text="{TemplateBinding Header}" />
</StackPanel>
<ContentControl Content="{TemplateBinding Header}"
IsTabStop="False" />
</local:SettingsCard.Header>
<local:SettingsCard.Description>
<TextBlock x:Name="HelpTextBlock"
Foreground="{ThemeResource SettingContainerMessageForeground}"
Style="{StaticResource SettingsPageItemDescriptionStyle}"
Text="{TemplateBinding HelpText}" />
</local:SettingsCard.Description>
<local:SettingsCard.HeaderIcon>
<FontIcon FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="{StaticResource SettingContainerIconFontSize}"
Foreground="{ThemeResource SettingContainerWarningSeverityIconBackground}"
Glyph="{StaticResource SettingContainerWarningIconGlyph}" />
</local:SettingsCard.HeaderIcon>
</local:SettingsCard>
</ControlTemplate>
</Setter.Value>
@@ -304,41 +238,18 @@
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:SettingContainer">
<local:SettingsCard Background="{ThemeResource SettingContainerErrorSeverityBackgroundBrush}">
<local:SettingsCard x:Name="Card"
Background="{ThemeResource SettingContainerErrorSeverityBackgroundBrush}">
<local:SettingsCard.Header>
<StackPanel Orientation="Horizontal">
<Grid>
<TextBlock x:Name="IconBackground"
Grid.Column="0"
Margin="{StaticResource SettingContainerIconMargin}"
VerticalAlignment="Center"
AutomationProperties.AccessibilityView="Raw"
FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="{StaticResource SettingContainerIconFontSize}"
Foreground="{ThemeResource SettingContainerErrorSeverityIconBackground}"
Text="{StaticResource SettingContainerIconBackgroundGlyph}" />
<TextBlock x:Name="StandardIcon"
Grid.Column="0"
Margin="{StaticResource SettingContainerIconMargin}"
VerticalAlignment="Center"
FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="{StaticResource SettingContainerIconFontSize}"
Foreground="{ThemeResource SettingContainerErrorSeverityIconForeground}"
Text="{StaticResource SettingContainerErrorIconGlyph}" />
</Grid>
<TextBlock VerticalAlignment="Center"
FontWeight="{StaticResource SettingContainerTitleFontWeight}"
Foreground="{ThemeResource SettingContainerTitleForeground}"
Style="{StaticResource SettingsPageItemHeaderStyle}"
Text="{TemplateBinding Header}" />
</StackPanel>
<ContentControl Content="{TemplateBinding Header}"
IsTabStop="False" />
</local:SettingsCard.Header>
<local:SettingsCard.Description>
<TextBlock x:Name="HelpTextBlock"
Foreground="{ThemeResource SettingContainerMessageForeground}"
Style="{StaticResource SettingsPageItemDescriptionStyle}"
Text="{TemplateBinding HelpText}" />
</local:SettingsCard.Description>
<local:SettingsCard.HeaderIcon>
<FontIcon FontFamily="{ThemeResource SymbolThemeFontFamily}"
FontSize="{StaticResource SettingContainerIconFontSize}"
Foreground="{ThemeResource SettingContainerErrorSeverityIconBackground}"
Glyph="{StaticResource SettingContainerErrorIconGlyph}" />
</local:SettingsCard.HeaderIcon>
</local:SettingsCard>
</ControlTemplate>
</Setter.Value>

View File

@@ -142,6 +142,30 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
return winrt::make<implementation::SettingsCardAutomationPeer>(*this);
}
// Pointer overrides: gate the ButtonBase click pipeline on IsClickEnabled.
// When IsClickEnabled=false, we do NOT call the base method, so the event
// is left unhandled and bubbles up the visual tree. This is what lets the
// SettingsExpander header (a ToggleButton hosting a SettingsCard with
// IsClickEnabled=false) toggle on a click anywhere across the header row,
// not just on the chevron. Mirrors the Community Toolkit's SettingsCard.cs.
void SettingsCard::OnPointerPressed(const winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs& e)
{
if (IsClickEnabled())
{
base_type::OnPointerPressed(e);
_GoToCommonState(PressedState, true);
}
}
void SettingsCard::OnPointerReleased(const winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs& e)
{
if (IsClickEnabled())
{
base_type::OnPointerReleased(e);
_GoToCommonState(NormalState, true);
}
}
void SettingsCard::OnApplyTemplate()
{
// Drop any handlers from a previous template.
@@ -296,18 +320,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
strongThis->_GoToCommonState(NormalState, true);
}
});
_pointerPressedRevoker = PointerPressed(winrt::auto_revoke, [weakThis = get_weak()](auto&&, auto&&) {
if (const auto strongThis = weakThis.get())
{
strongThis->_GoToCommonState(PressedState, true);
}
});
_pointerReleasedRevoker = PointerReleased(winrt::auto_revoke, [weakThis = get_weak()](auto&&, auto&&) {
if (const auto strongThis = weakThis.get())
{
strongThis->_GoToCommonState(NormalState, true);
}
});
_pointerCaptureLostRevoker = PointerCaptureLost(winrt::auto_revoke, [weakThis = get_weak()](auto&&, auto&&) {
if (const auto strongThis = weakThis.get())
{
@@ -356,8 +368,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
IsTabStop(false);
_pointerEnteredRevoker.revoke();
_pointerExitedRevoker.revoke();
_pointerPressedRevoker.revoke();
_pointerReleasedRevoker.revoke();
_pointerCaptureLostRevoker.revoke();
_pointerCanceledRevoker.revoke();
_previewKeyDownRevoker.revoke();

View File

@@ -28,6 +28,8 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
SettingsCard();
void OnApplyTemplate();
void OnPointerPressed(const Windows::UI::Xaml::Input::PointerRoutedEventArgs& e);
void OnPointerReleased(const Windows::UI::Xaml::Input::PointerRoutedEventArgs& e);
// Automation peer override.
Windows::UI::Xaml::Automation::Peers::AutomationPeer OnCreateAutomationPeer();
@@ -68,8 +70,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
Windows::UI::Xaml::Controls::Control::IsEnabledChanged_revoker _isEnabledChangedRevoker;
Windows::UI::Xaml::UIElement::PointerEntered_revoker _pointerEnteredRevoker;
Windows::UI::Xaml::UIElement::PointerExited_revoker _pointerExitedRevoker;
Windows::UI::Xaml::UIElement::PointerPressed_revoker _pointerPressedRevoker;
Windows::UI::Xaml::UIElement::PointerReleased_revoker _pointerReleasedRevoker;
Windows::UI::Xaml::UIElement::PointerCaptureLost_revoker _pointerCaptureLostRevoker;
Windows::UI::Xaml::UIElement::PointerCanceled_revoker _pointerCanceledRevoker;
Windows::UI::Xaml::UIElement::PreviewKeyDown_revoker _previewKeyDownRevoker;

View File

@@ -700,8 +700,9 @@
<!--
Header ToggleButton style for the custom Expander template above.
Drives header coloring to match a sibling SettingsCard, and animates
the chevron's AnimatedIcon between NormalOn/Off, PointerOverOn/Off,
and PressedOn/Off states.
the chevron's rotation between 0° (collapsed) and 180° (expanded) via
a DoubleAnimation on a RotateTransform. (The toolkit uses a Lottie
AnimatedIcon morph; see comment on ExpandCollapseChevron below.)
-->
<Style x:Key="SettingsExpanderHeaderDownStyle"
TargetType="ToggleButton">
@@ -756,9 +757,10 @@
<!--
Toolkit uses a muxc:AnimatedIcon wrapping AnimatedChevronUpDownSmallVisualSource.
That visual source isn't available in the WinUI 2 build the editor targets, so
we fall back to a static FontIcon. We rotate it 180° in the Checked* states to
indicate the expanded state (mirrors the visual outcome of the animated icon,
without the morph animation).
we fall back to a static FontIcon and drive a RotateTransform via the
Checked*/unchecked CommonStates Storyboards (DoubleAnimation between 0° and 180°).
This reproduces the smooth expand/collapse chevron animation visually, even
without the toolkit's Lottie morph.
-->
<FontIcon x:Name="ExpandCollapseChevron"
Width="16"
@@ -802,6 +804,14 @@
<DiscreteObjectKeyFrame KeyTime="0"
Value="{ThemeResource SettingsCardBackground}" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="ExpandCollapseChevronRotation"
Storyboard.TargetProperty="Angle"
To="0"
Duration="0:0:0.167">
<DoubleAnimation.EasingFunction>
<CubicEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</VisualState>
<VisualState x:Name="PointerOver">
@@ -826,6 +836,14 @@
<DiscreteObjectKeyFrame KeyTime="0"
Value="{ThemeResource SettingsCardBackgroundPointerOver}" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="ExpandCollapseChevronRotation"
Storyboard.TargetProperty="Angle"
To="0"
Duration="0:0:0.167">
<DoubleAnimation.EasingFunction>
<CubicEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
@@ -850,6 +868,14 @@
<DiscreteObjectKeyFrame KeyTime="0"
Value="{ThemeResource SettingsCardBackgroundPressed}" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="ExpandCollapseChevronRotation"
Storyboard.TargetProperty="Angle"
To="0"
Duration="0:0:0.167">
<DoubleAnimation.EasingFunction>
<CubicEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled">
@@ -869,6 +895,14 @@
<DiscreteObjectKeyFrame KeyTime="0"
Value="{ThemeResource ExpanderHeaderDisabledForeground}" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="ExpandCollapseChevronRotation"
Storyboard.TargetProperty="Angle"
To="0"
Duration="0:0:0.167">
<DoubleAnimation.EasingFunction>
<CubicEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</VisualState>
<VisualState x:Name="Checked">
@@ -893,10 +927,15 @@
<DiscreteObjectKeyFrame KeyTime="0"
Value="{ThemeResource ExpanderChevronBackground}" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="ExpandCollapseChevronRotation"
Storyboard.TargetProperty="Angle"
To="180"
Duration="0:0:0.167">
<DoubleAnimation.EasingFunction>
<CubicEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
<VisualState.Setters>
<Setter Target="ExpandCollapseChevronRotation.Angle" Value="180" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="CheckedPointerOver">
<Storyboard>
@@ -920,10 +959,15 @@
<DiscreteObjectKeyFrame KeyTime="0"
Value="{ThemeResource SettingsCardBackgroundPointerOver}" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="ExpandCollapseChevronRotation"
Storyboard.TargetProperty="Angle"
To="180"
Duration="0:0:0.167">
<DoubleAnimation.EasingFunction>
<CubicEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
<VisualState.Setters>
<Setter Target="ExpandCollapseChevronRotation.Angle" Value="180" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="CheckedPressed">
<Storyboard>
@@ -947,10 +991,15 @@
<DiscreteObjectKeyFrame KeyTime="0"
Value="{ThemeResource SettingsCardBackgroundPressed}" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="ExpandCollapseChevronRotation"
Storyboard.TargetProperty="Angle"
To="180"
Duration="0:0:0.167">
<DoubleAnimation.EasingFunction>
<CubicEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
<VisualState.Setters>
<Setter Target="ExpandCollapseChevronRotation.Angle" Value="180" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="CheckedDisabled">
<Storyboard>
@@ -969,10 +1018,15 @@
<DiscreteObjectKeyFrame KeyTime="0"
Value="{ThemeResource SettingsCardBorderBrushDisabled}" />
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="ExpandCollapseChevronRotation"
Storyboard.TargetProperty="Angle"
To="180"
Duration="0:0:0.167">
<DoubleAnimation.EasingFunction>
<CubicEase EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
<VisualState.Setters>
<Setter Target="ExpandCollapseChevronRotation.Angle" Value="180" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Indeterminate" />
<VisualState x:Name="IndeterminatePointerOver" />