CmdPal: Ensure visual state groups set properties exclusively (#49319)

## Summary of the Pull Request

This PR updates DockItemControl to ensure that visual state groups
exclusively set properties and don't overlap to prevent unexpected and
undeterministic result.

- TextVisibilityStates and TextAlignmentStates shared
SubtitleText.Visibility
- TextVisibilityStates and IconVisibilityStates shared
ContentGrid.ColumnSpacing

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [x] Closes: #47980
- [x] Closes: #49156
<!-- - [ ] Closes: #yyy (add separate lines for additional resolved
issues) -->
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [YML for signed
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml)
- [ ] **Documentation updated:** If checked, please file a pull request
on [our docs
repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys)
and link it here: #xxx

<!-- Provide a more detailed description of the PR, other things fixed,
or any additional comments/features here -->
## Detailed Description of the Pull Request / Additional comments

<!-- Describe how you validated the behavior. Add automated tests
wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed
This commit is contained in:
Jiří Polášek
2026-07-21 17:29:03 +02:00
committed by GitHub
parent bc32d4216c
commit c87ef67103
2 changed files with 34 additions and 10 deletions

View File

@@ -152,11 +152,7 @@
</VisualStateGroup>
<VisualStateGroup x:Name="TextVisibilityStates">
<VisualState x:Name="TextVisible" />
<VisualState x:Name="TitleOnly">
<VisualState.Setters>
<Setter Target="SubtitleText.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="TitleOnly" />
<VisualState x:Name="SubtitleOnly">
<VisualState.Setters>
<Setter Target="TitleText.Visibility" Value="Collapsed" />
@@ -165,21 +161,35 @@
</VisualState>
<VisualState x:Name="TextHidden">
<VisualState.Setters>
<Setter Target="ContentGrid.ColumnSpacing" Value="0" />
<Setter Target="ContentGrid.HorizontalAlignment" Value="Center" />
<Setter Target="TextPanel.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="SubtitleVisibilityStates">
<VisualState x:Name="SubtitleVisible" />
<VisualState x:Name="SubtitleHidden">
<VisualState.Setters>
<Setter Target="SubtitleText.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="IconVisibilityStates">
<VisualState x:Name="IconVisible" />
<VisualState x:Name="IconHidden">
<VisualState.Setters>
<Setter Target="ContentGrid.ColumnSpacing" Value="0" />
<Setter Target="IconPresenter.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="ContentSpacingStates">
<VisualState x:Name="ContentSpacingVisible" />
<VisualState x:Name="ContentSpacingHidden">
<VisualState.Setters>
<Setter Target="ContentGrid.ColumnSpacing" Value="0" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="TextAlignmentStates">
<VisualState x:Name="TextLeftAligned">
<VisualState.Setters>
@@ -199,7 +209,6 @@
<VisualState x:Name="Compact">
<VisualState.Setters>
<Setter Target="PART_RootGrid.Padding" Value="0" />
<Setter Target="SubtitleText.Visibility" Value="Collapsed" />
<Setter Target="TitleText.Margin" Value="0,-1,0,0" />
</VisualState.Setters>
</VisualState>
@@ -211,4 +220,4 @@
</Setter>
</Style.Setters>
</Style>
</ResourceDictionary>
</ResourceDictionary>

View File

@@ -104,6 +104,7 @@ public sealed partial class DockItemControl : Control
private void UpdateCompactState()
{
VisualStateManager.GoToState(this, IsCompact ? "Compact" : "DefaultLayout", true);
UpdateSubtitleVisibilityState();
}
private const string IconPresenterName = "IconPresenter";
@@ -120,7 +121,6 @@ public sealed partial class DockItemControl : Control
{
control.UpdateTextVisibility();
control.UpdateAlignment();
control.UpdateCompactState();
}
}
@@ -142,6 +142,8 @@ public sealed partial class DockItemControl : Control
private void UpdateTextVisibility()
{
UpdateTextVisibilityState();
UpdateSubtitleVisibilityState();
UpdateContentSpacingState();
}
private void UpdateTextVisibilityState()
@@ -166,6 +168,12 @@ public sealed partial class DockItemControl : Control
VisualStateManager.GoToState(this, stateName, true);
}
private void UpdateSubtitleVisibilityState()
{
var showSubtitle = HasSubtitle && !IsCompact;
VisualStateManager.GoToState(this, showSubtitle ? "SubtitleVisible" : "SubtitleHidden", true);
}
private void UpdateIconVisibility()
{
var shouldShowIcon = ShouldShowIcon();
@@ -175,6 +183,7 @@ public sealed partial class DockItemControl : Control
}
UpdateIconVisibilityState();
UpdateContentSpacingState();
}
private void UpdateIconVisibilityState()
@@ -182,6 +191,12 @@ public sealed partial class DockItemControl : Control
VisualStateManager.GoToState(this, ShouldShowIcon() ? "IconVisible" : "IconHidden", true);
}
private void UpdateContentSpacingState()
{
var showSpacing = TextVisibility != Visibility.Collapsed && HasText && ShouldShowIcon();
VisualStateManager.GoToState(this, showSpacing ? "ContentSpacingVisible" : "ContentSpacingHidden", true);
}
private void UpdateAlignment()
{
HorizontalAlignment = HorizontalAlignment.Stretch;