Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
f24cec7
Add check for updates feature (#1)
erikdarlingdata Feb 12, 2026
24b2d5a
Merge pull request #3 from erikdarlingdata/feature/1-check-for-updates
erikdarlingdata Feb 12, 2026
78ff66f
Lite overview: show Online/Offline status for servers (#2)
erikdarlingdata Feb 12, 2026
dfa7dd8
Merge pull request #6 from erikdarlingdata/feature/2-lite-overview-st…
erikdarlingdata Feb 12, 2026
a5cab04
Lite: show per-server collector health in status bar (#5)
erikdarlingdata Feb 12, 2026
5d496e3
Merge pull request #7 from erikdarlingdata/feature/5-lite-per-server-…
erikdarlingdata Feb 12, 2026
2e943a8
Add support for High DPI to the Dashboard
ClaudioESSilva Feb 12, 2026
1e96f31
Add support for High DPI to the Lite
ClaudioESSilva Feb 12, 2026
cff77bf
Add workflow to enforce PRs to main must come from dev
erikdarlingdata Feb 13, 2026
49f05cc
Exclude WAITFOR queries from top queries views (#4)
erikdarlingdata Feb 13, 2026
67a2c39
Merge pull request #14 from erikdarlingdata/feature/4-exclude-waitfor
erikdarlingdata Feb 13, 2026
60b6b68
Dashboard: always show legends on Performance Trends charts (#11)
erikdarlingdata Feb 13, 2026
ac47137
Merge pull request #15 from erikdarlingdata/feature/11-trends-legends
erikdarlingdata Feb 13, 2026
28db7cc
Clean unneeded code
ClaudioESSilva Feb 13, 2026
c939be2
Grafana-inspired dark theme + tray icon polish (#16)
erikdarlingdata Feb 13, 2026
90170ed
Merge pull request #10 from ClaudioESSilva/feature/high-dpi-awareness
erikdarlingdata Feb 13, 2026
c2d1841
Centralized Material Design 300 color palette + visual polish (#16)
erikdarlingdata Feb 13, 2026
b0aa8fe
Fix Wait Stats "Select All" with poison waits + usual suspects + top …
erikdarlingdata Feb 13, 2026
0ce2ab1
Expand wait stats chart limit from 12 to 20, add selection counter
erikdarlingdata Feb 13, 2026
a700982
Add new auth option "Microsoft Entra MFA"
ClaudioESSilva Feb 13, 2026
dc82979
Remove StatusText changes
ClaudioESSilva Feb 13, 2026
911ce95
Fix blocking/deadlock XML processors truncating parsed data every run…
erikdarlingdata Feb 13, 2026
6129852
Merge feature/23-is-processed-tracking: Fix blocking/deadlock XML pro…
erikdarlingdata Feb 13, 2026
0b06da0
Fix query text off-by-one truncation (#25)
erikdarlingdata Feb 13, 2026
1f9a42e
Merge feature/25-query-text-off-by-one: Fix query text off-by-one tru…
erikdarlingdata Feb 13, 2026
07ef92a
Lite: add column-level filtering to all data grids (#18)
erikdarlingdata Feb 13, 2026
0a9f043
Merge pull request #26 from erikdarlingdata/feature/18-lite-column-fi…
erikdarlingdata Feb 13, 2026
84b0c2b
Add wait stats hover tooltips to Dashboard and Lite (#21)
erikdarlingdata Feb 13, 2026
f1d93c1
Handle MFA cancellation an retries. Also behaviour when app startup a…
ClaudioESSilva Feb 13, 2026
a8c87cc
Expand hover tooltips to all multi-series charts (#21)
erikdarlingdata Feb 13, 2026
5c92fb8
Merge feature/chart-visual-parity: Chart visual parity + Material Des…
erikdarlingdata Feb 13, 2026
3321d79
Merge feature/12-wait-stats-top-waits: Smart Select All + expand to 2…
erikdarlingdata Feb 13, 2026
52b7875
Fix ClearAll not refreshing wait type search filter in Dashboard
erikdarlingdata Feb 13, 2026
2a5d796
Fix Critical: Backward compatibility break related to "Authentication…
ClaudioESSilva Feb 13, 2026
2d469d1
Fix the "Bug: AADSTS50126 is not cancellation"
ClaudioESSilva Feb 13, 2026
ce72f13
Fix "Code duplication: IsMfaCancelledException appears 3 times"
ClaudioESSilva Feb 13, 2026
55e46f7
Fix "Magic strings"
ClaudioESSilva Feb 13, 2026
beaca1a
fix "Dead code in CheckConnectionAsync"
ClaudioESSilva Feb 13, 2026
1ee09c4
Fix "UseWindowsAuth is now redundant"
ClaudioESSilva Feb 13, 2026
28c8aea
Fix "Minor: _isDialogOpen static flag"
ClaudioESSilva Feb 13, 2026
09e22ef
Merge pull request #27 from ClaudioESSilva/feature/support-Microsoft-…
erikdarlingdata Feb 13, 2026
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
21 changes: 21 additions & 0 deletions .github/workflows/check-pr-branch.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Check pull request target branch
on:
pull_request_target:
types:
- opened
- reopened
- synchronize
- edited
jobs:
check-branches:
runs-on: ubuntu-latest
steps:
- name: Check branches
env:
HEAD_REF: ${{ github.head_ref }}
BASE_REF: ${{ github.base_ref }}
run: |
if [ "$HEAD_REF" != "dev" ] && [ "$BASE_REF" == "main" ]; then
echo "::error::Pull requests to main are only allowed from dev. Please target the dev branch instead."
exit 1
fi
7 changes: 3 additions & 4 deletions Dashboard/AboutWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,12 @@
Check for Updates
</Hyperlink>
</TextBlock>
<TextBlock x:Name="UpdateStatusText" FontSize="11" Foreground="{DynamicResource ForegroundMutedBrush}" Margin="0,3,0,0" Visibility="Collapsed"/>
</StackPanel>

<!-- Credits -->
<!-- Links -->
<StackPanel Grid.Row="4">
<TextBlock Text="Credits" FontWeight="Bold" Margin="0,0,0,5"/>
<TextBlock Text="Created by Erik Darling" FontSize="12"/>
<TextBlock FontSize="12" Margin="0,5,0,0">
<TextBlock FontSize="12">
<Hyperlink x:Name="DarlingDataLink" Click="DarlingDataLink_Click">
www.erikdarling.com
</Hyperlink>
Expand Down
35 changes: 33 additions & 2 deletions Dashboard/AboutWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using System.Diagnostics;
using System.Reflection;
using System.Windows;
using PerformanceMonitorDashboard.Services;

namespace PerformanceMonitorDashboard
{
Expand All @@ -17,6 +18,8 @@ public partial class AboutWindow : Window
private const string ReleasesUrl = "https://github.com/erikdarlingdata/PerformanceMonitor/releases";
private const string DarlingDataUrl = "https://www.erikdarling.com";

private string? _updateReleaseUrl;

public AboutWindow()
{
InitializeComponent();
Expand All @@ -39,9 +42,37 @@ private void ReportIssueLink_Click(object sender, RoutedEventArgs e)
OpenUrl(IssuesUrl);
}

private void CheckUpdatesLink_Click(object sender, RoutedEventArgs e)
private async void CheckUpdatesLink_Click(object sender, RoutedEventArgs e)
{
UpdateStatusText.Text = "Checking for updates...";
UpdateStatusText.Visibility = Visibility.Visible;

var result = await UpdateCheckService.CheckForUpdateAsync(bypassCache: true);

if (result == null)
{
UpdateStatusText.Text = "Unable to check for updates. Please try again later.";
}
else if (result.IsUpdateAvailable)
{
_updateReleaseUrl = result.ReleaseUrl;
UpdateStatusText.Text = $"Update available: {result.LatestVersion} (you have {result.CurrentVersion})";
UpdateStatusText.Cursor = System.Windows.Input.Cursors.Hand;
UpdateStatusText.MouseLeftButtonUp += UpdateStatusText_Click;
UpdateStatusText.TextDecorations = System.Windows.TextDecorations.Underline;
UpdateStatusText.Foreground = FindResource("AccentBrush") as System.Windows.Media.Brush
?? System.Windows.Media.Brushes.DodgerBlue;
}
else
{
UpdateStatusText.Text = $"You're up to date ({result.CurrentVersion})";
}
}

private void UpdateStatusText_Click(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
OpenUrl(ReleasesUrl);
if (!string.IsNullOrEmpty(_updateReleaseUrl))
OpenUrl(_updateReleaseUrl);
}

private void DarlingDataLink_Click(object sender, RoutedEventArgs e)
Expand Down
1 change: 1 addition & 0 deletions Dashboard/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ protected override void OnExit(ExitEventArgs e)
base.OnExit(e);
}


private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
var exception = e.ExceptionObject as Exception;
Expand Down
6 changes: 3 additions & 3 deletions Dashboard/Controls/LandingPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -113,15 +113,15 @@
Padding="16,8">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<StackPanel Orientation="Horizontal" Margin="0,0,20,0">
<Ellipse Width="10" Height="10" Fill="#22C55E" Margin="0,0,6,0"/>
<Ellipse Width="10" Height="10" Fill="#81C784" Margin="0,0,6,0"/>
<TextBlock Text="Healthy" FontSize="11" Foreground="{DynamicResource ForegroundMutedBrush}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,20,0">
<Ellipse Width="10" Height="10" Fill="#F59E0B" Margin="0,0,6,0"/>
<Ellipse Width="10" Height="10" Fill="#FFD54F" Margin="0,0,6,0"/>
<TextBlock Text="Warning" FontSize="11" Foreground="{DynamicResource ForegroundMutedBrush}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,20,0">
<Ellipse Width="10" Height="10" Fill="#EF4444" Margin="0,0,6,0"/>
<Ellipse Width="10" Height="10" Fill="#E57373" Margin="0,0,6,0"/>
<TextBlock Text="Critical" FontSize="11" Foreground="{DynamicResource ForegroundMutedBrush}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
Expand Down
44 changes: 22 additions & 22 deletions Dashboard/Controls/MemoryContent.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -213,26 +213,26 @@ private void LoadMemoryStatsOverviewChart(List<MemoryStatsItem> memoryData, int

var totalScatter = MemoryStatsOverviewChart.Plot.Add.Scatter(totalXs, totalYs);
totalScatter.LineWidth = 2;
totalScatter.MarkerSize = 0;
totalScatter.Color = ScottPlot.Colors.Gray;
totalScatter.MarkerSize = 5;
totalScatter.Color = TabHelpers.ChartColors[9];
totalScatter.LegendText = "Total Memory";

var bufferScatter = MemoryStatsOverviewChart.Plot.Add.Scatter(bufferXs, bufferYs);
bufferScatter.LineWidth = 2;
bufferScatter.MarkerSize = 0;
bufferScatter.Color = ScottPlot.Colors.Blue;
bufferScatter.MarkerSize = 5;
bufferScatter.Color = TabHelpers.ChartColors[0];
bufferScatter.LegendText = "Buffer Pool";

var cacheScatter = MemoryStatsOverviewChart.Plot.Add.Scatter(cacheXs, cacheYs);
cacheScatter.LineWidth = 2;
cacheScatter.MarkerSize = 0;
cacheScatter.Color = ScottPlot.Colors.Green;
cacheScatter.MarkerSize = 5;
cacheScatter.Color = TabHelpers.ChartColors[1];
cacheScatter.LegendText = "Plan Cache";

var availScatter = MemoryStatsOverviewChart.Plot.Add.Scatter(availXs, availYs);
availScatter.LineWidth = 2;
availScatter.MarkerSize = 0;
availScatter.Color = ScottPlot.Colors.Orange;
availScatter.MarkerSize = 5;
availScatter.Color = TabHelpers.ChartColors[2];
availScatter.LegendText = "Available Physical";

_legendPanels[MemoryStatsOverviewChart] = MemoryStatsOverviewChart.Plot.ShowLegend(ScottPlot.Edge.Bottom);
Expand Down Expand Up @@ -282,7 +282,7 @@ private void AddPressureWarningSpans(List<MemoryStatsItem> dataList)

if (item.BufferPoolPressureWarning && item.PlanCachePressureWarning)
{
vline.Color = ScottPlot.Colors.Red.WithAlpha(0.5);
vline.Color = TabHelpers.ChartColors[3].WithAlpha(0.5);
// Add legend entry for BP pressure (covers "both" case too)
if (!bpLegendAdded)
{
Expand All @@ -292,7 +292,7 @@ private void AddPressureWarningSpans(List<MemoryStatsItem> dataList)
}
else if (item.BufferPoolPressureWarning)
{
vline.Color = ScottPlot.Colors.Red.WithAlpha(0.3);
vline.Color = TabHelpers.ChartColors[3].WithAlpha(0.3);
if (!bpLegendAdded)
{
vline.LegendText = "BP Pressure";
Expand All @@ -301,7 +301,7 @@ private void AddPressureWarningSpans(List<MemoryStatsItem> dataList)
}
else
{
vline.Color = ScottPlot.Colors.Orange.WithAlpha(0.3);
vline.Color = TabHelpers.ChartColors[2].WithAlpha(0.3);
if (!pcLegendAdded)
{
vline.LegendText = "PC Pressure";
Expand Down Expand Up @@ -419,14 +419,14 @@ private void LoadMemoryGrantsChart(IEnumerable<MemoryGrantStatsItem> data, int h
{
var grantedScatter = MemoryGrantsChart.Plot.Add.Scatter(grantedXs, grantedYs);
grantedScatter.LineWidth = 2;
grantedScatter.MarkerSize = 0;
grantedScatter.Color = ScottPlot.Colors.Blue;
grantedScatter.MarkerSize = 5;
grantedScatter.Color = TabHelpers.ChartColors[0];
grantedScatter.LegendText = "Granted MB";

var targetScatter = MemoryGrantsChart.Plot.Add.Scatter(targetXs, targetYs);
targetScatter.LineWidth = 2;
targetScatter.MarkerSize = 0;
targetScatter.Color = ScottPlot.Colors.Orange;
targetScatter.MarkerSize = 5;
targetScatter.Color = TabHelpers.ChartColors[2];
targetScatter.LegendText = "Target MB";

_legendPanels[MemoryGrantsChart] = MemoryGrantsChart.Plot.ShowLegend(ScottPlot.Edge.Bottom);
Expand Down Expand Up @@ -502,7 +502,7 @@ private void LoadMemoryClerksChart(List<MemoryClerksItem> data, int hoursBack, D
.Select(x => x.ClerkType)
.ToList();

var colors = new[] { ScottPlot.Colors.Blue, ScottPlot.Colors.Green, ScottPlot.Colors.Orange, ScottPlot.Colors.Red, ScottPlot.Colors.Purple };
var colors = TabHelpers.ChartColors;
int colorIndex = 0;

foreach (var clerkType in topClerks)
Expand All @@ -519,7 +519,7 @@ private void LoadMemoryClerksChart(List<MemoryClerksItem> data, int hoursBack, D

var scatter = MemoryClerksChart.Plot.Add.Scatter(xs, ys);
scatter.LineWidth = 2;
scatter.MarkerSize = 0;
scatter.MarkerSize = 5;
scatter.Color = colors[colorIndex % colors.Length];
scatter.LegendText = clerkType.Length > 20 ? clerkType.Substring(0, 20) + "..." : clerkType;
colorIndex++;
Expand Down Expand Up @@ -647,8 +647,8 @@ private void LoadPlanCacheChart(IEnumerable<PlanCacheStatsItem> data, int hoursB

var singleScatter = PlanCacheChart.Plot.Add.Scatter(singleXs, singleYs);
singleScatter.LineWidth = 2;
singleScatter.MarkerSize = 0;
singleScatter.Color = ScottPlot.Colors.Red;
singleScatter.MarkerSize = 5;
singleScatter.Color = TabHelpers.ChartColors[3];
singleScatter.LegendText = "Single-Use";

// Multi-Use series with gap filling
Expand All @@ -658,8 +658,8 @@ private void LoadPlanCacheChart(IEnumerable<PlanCacheStatsItem> data, int hoursB

var multiScatter = PlanCacheChart.Plot.Add.Scatter(multiXs, multiYs);
multiScatter.LineWidth = 2;
multiScatter.MarkerSize = 0;
multiScatter.Color = ScottPlot.Colors.Green;
multiScatter.MarkerSize = 5;
multiScatter.Color = TabHelpers.ChartColors[1];
multiScatter.LegendText = "Multi-Use";

_legendPanels[PlanCacheChart] = PlanCacheChart.Plot.ShowLegend(ScottPlot.Edge.Bottom);
Expand Down Expand Up @@ -786,7 +786,7 @@ private void LoadMemoryPressureEventsChart(IEnumerable<MemoryPressureEventItem>
var highScatter = MemoryPressureEventsChart.Plot.Add.Scatter(xs, ys);
highScatter.LineWidth = 2;
highScatter.MarkerSize = 5;
highScatter.Color = ScottPlot.Colors.Red;
highScatter.Color = TabHelpers.ChartColors[3];
highScatter.LegendText = "High Pressure Events";

_legendPanels[MemoryPressureEventsChart] = MemoryPressureEventsChart.Plot.ShowLegend(ScottPlot.Edge.Bottom);
Expand Down
48 changes: 22 additions & 26 deletions Dashboard/Controls/QueryPerformanceContent.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -243,9 +243,9 @@ await Task.WhenAll(
QueryStoreNoDataMessage.Visibility = queryStore.Count == 0 ? Visibility.Visible : Visibility.Collapsed;

// Populate charts from time-series data
LoadDurationChart(QueryPerfTrendsQueryChart, await queryDurationTrendsTask, _perfTrendsHoursBack, _perfTrendsFromDate, _perfTrendsToDate, "Duration (ms/sec)", ScottPlot.Colors.Blue);
LoadDurationChart(QueryPerfTrendsProcChart, await procDurationTrendsTask, _perfTrendsHoursBack, _perfTrendsFromDate, _perfTrendsToDate, "Duration (ms/sec)", ScottPlot.Colors.Green);
LoadDurationChart(QueryPerfTrendsQsChart, await qsDurationTrendsTask, _perfTrendsHoursBack, _perfTrendsFromDate, _perfTrendsToDate, "Duration (ms/sec)", ScottPlot.Colors.Purple);
LoadDurationChart(QueryPerfTrendsQueryChart, await queryDurationTrendsTask, _perfTrendsHoursBack, _perfTrendsFromDate, _perfTrendsToDate, "Duration (ms/sec)", TabHelpers.ChartColors[0]);
LoadDurationChart(QueryPerfTrendsProcChart, await procDurationTrendsTask, _perfTrendsHoursBack, _perfTrendsFromDate, _perfTrendsToDate, "Duration (ms/sec)", TabHelpers.ChartColors[1]);
LoadDurationChart(QueryPerfTrendsQsChart, await qsDurationTrendsTask, _perfTrendsHoursBack, _perfTrendsFromDate, _perfTrendsToDate, "Duration (ms/sec)", TabHelpers.ChartColors[4]);
LoadExecChart(await execTrendsTask, _perfTrendsHoursBack, _perfTrendsFromDate, _perfTrendsToDate);
}
catch (Exception ex)
Expand Down Expand Up @@ -915,18 +915,13 @@ private void LoadDurationChart(WpfPlot chart, IEnumerable<DurationTrendItem> tre
dataList.Select(d => d.CollectionTime),
dataList.Select(d => d.AvgDurationMs));

if (xs.Length > 0)
{
var scatter = chart.Plot.Add.Scatter(xs, ys);
scatter.LineWidth = 2;
scatter.MarkerSize = 5;
scatter.Color = color;
scatter.LegendText = legendText;

_legendPanels[chart] = chart.Plot.ShowLegend(ScottPlot.Edge.Bottom);
chart.Plot.Legend.FontSize = 12;
}
else
var scatter = chart.Plot.Add.Scatter(xs, ys);
scatter.LineWidth = 2;
scatter.MarkerSize = 5;
scatter.Color = color;
scatter.LegendText = legendText;

if (xs.Length == 0)
{
double xCenter = xMin + (xMax - xMin) / 2;
var noDataText = chart.Plot.Add.Text("No data for selected time range", xCenter, 0.5);
Expand All @@ -935,6 +930,9 @@ private void LoadDurationChart(WpfPlot chart, IEnumerable<DurationTrendItem> tre
noDataText.LabelAlignment = ScottPlot.Alignment.MiddleCenter;
}

_legendPanels[chart] = chart.Plot.ShowLegend(ScottPlot.Edge.Bottom);
chart.Plot.Legend.FontSize = 12;

chart.Plot.Axes.DateTimeTicksBottom();
chart.Plot.Axes.SetLimitsX(xMin, xMax);
chart.Plot.YLabel("Duration (ms/sec)");
Expand Down Expand Up @@ -971,18 +969,13 @@ private void LoadExecChart(IEnumerable<ExecutionTrendItem> execTrends, int hours
dataList.Select(d => d.CollectionTime),
dataList.Select(d => (double)d.ExecutionsPerSecond));

if (xs.Length > 0)
{
var scatter = QueryPerfTrendsExecChart.Plot.Add.Scatter(xs, ys);
scatter.LineWidth = 2;
scatter.MarkerSize = 5;
scatter.Color = ScottPlot.Colors.Blue;
scatter.LegendText = "Executions/sec";
var scatter = QueryPerfTrendsExecChart.Plot.Add.Scatter(xs, ys);
scatter.LineWidth = 2;
scatter.MarkerSize = 5;
scatter.Color = TabHelpers.ChartColors[0];
scatter.LegendText = "Executions/sec";

_legendPanels[QueryPerfTrendsExecChart] = QueryPerfTrendsExecChart.Plot.ShowLegend(ScottPlot.Edge.Bottom);
QueryPerfTrendsExecChart.Plot.Legend.FontSize = 12;
}
else
if (xs.Length == 0)
{
double xCenter = xMin + (xMax - xMin) / 2;
var noDataText = QueryPerfTrendsExecChart.Plot.Add.Text("No data for selected time range", xCenter, 0.5);
Expand All @@ -991,6 +984,9 @@ private void LoadExecChart(IEnumerable<ExecutionTrendItem> execTrends, int hours
noDataText.LabelAlignment = ScottPlot.Alignment.MiddleCenter;
}

_legendPanels[QueryPerfTrendsExecChart] = QueryPerfTrendsExecChart.Plot.ShowLegend(ScottPlot.Edge.Bottom);
QueryPerfTrendsExecChart.Plot.Legend.FontSize = 12;

QueryPerfTrendsExecChart.Plot.Axes.DateTimeTicksBottom();
QueryPerfTrendsExecChart.Plot.Axes.SetLimitsX(xMin, xMax);
QueryPerfTrendsExecChart.Plot.YLabel("Executions/sec");
Expand Down
3 changes: 2 additions & 1 deletion Dashboard/Controls/ResourceMetricsContent.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,9 @@
<Button Content="Refresh" Click="WaitStatsDetail_Refresh_Click" Margin="10,0,0,0" Padding="8,2" Style="{StaticResource SuccessButton}" FontSize="11"/>
</StackPanel>
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="5,2">
<Button Content="Select All" Click="WaitTypes_SelectAll_Click" Padding="6,2" FontSize="10" Margin="0,0,5,0"/>
<Button Content="Top Waits" Click="WaitTypes_SelectAll_Click" Padding="6,2" FontSize="10" Margin="0,0,5,0"/>
<Button Content="Clear All" Click="WaitTypes_ClearAll_Click" Padding="6,2" FontSize="10"/>
<TextBlock x:Name="WaitTypeCountText" Text="0 / 20 selected" FontSize="10" Foreground="{DynamicResource ForegroundMutedBrush}" VerticalAlignment="Center" Margin="8,0,0,0"/>
</StackPanel>
<TextBox Grid.Row="2" x:Name="WaitTypeSearchBox" Margin="5,2" Height="24" FontSize="11"
TextChanged="WaitTypeSearch_TextChanged"
Expand Down
Loading
Loading