Skip to content

Commit 3f5f37f

Browse files
BornToBeRootCopilotCopilot
authored
Fix: DataGrid last column resize to view width (#3417)
* Fix: DataGrid last column resize to view width * Chore: Minor adjustments * Chore: Minor adjustments * Update next-release.md * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Refactor: Extract star column refresh into shared DataGridHelper attached property Agent-Logs-Url: https://github.com/BornToBeRoot/NETworkManager/sessions/090031d0-133d-4e38-becd-526f4b8dd846 Co-authored-by: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> * Chore: refactoring --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
1 parent 8c31ee8 commit 3f5f37f

23 files changed

Lines changed: 230 additions & 682 deletions
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
using System.Windows;
3+
using System.Windows.Controls;
4+
using System.Windows.Threading;
5+
6+
namespace NETworkManager.Utilities.WPF;
7+
8+
/// <summary>
9+
/// Attached-property helpers for <see cref="DataGrid"/>.
10+
/// </summary>
11+
public static class DataGridHelper
12+
{
13+
/// <summary>
14+
/// When set to <see langword="true"/>, forces star-sized columns to recompute their width after
15+
/// the first row is realized. Without this, an initially empty <see cref="DataGrid"/> sizes star
16+
/// columns to <c>MinWidth</c> because the inner <see cref="System.Windows.Controls.ScrollViewer"/>
17+
/// measures with infinite width; only a window resize would otherwise trigger a correct re-measure.
18+
/// The handler unsubscribes itself after the first row so there is no ongoing overhead.
19+
/// </summary>
20+
public static readonly DependencyProperty RefreshStarColumnsOnFirstRowProperty =
21+
DependencyProperty.RegisterAttached(
22+
"RefreshStarColumnsOnFirstRow",
23+
typeof(bool),
24+
typeof(DataGridHelper),
25+
new PropertyMetadata(false, OnRefreshStarColumnsOnFirstRowChanged));
26+
27+
public static void SetRefreshStarColumnsOnFirstRow(DataGrid element, bool value) =>
28+
element.SetValue(RefreshStarColumnsOnFirstRowProperty, value);
29+
30+
public static bool GetRefreshStarColumnsOnFirstRow(DataGrid element) =>
31+
(bool)element.GetValue(RefreshStarColumnsOnFirstRowProperty);
32+
33+
private static void OnRefreshStarColumnsOnFirstRowChanged(DependencyObject d,
34+
DependencyPropertyChangedEventArgs e)
35+
{
36+
if (d is not DataGrid dataGrid || e.NewValue is not bool enabled || !enabled)
37+
return;
38+
39+
dataGrid.LoadingRow += Handler;
40+
return;
41+
42+
void Handler(object sender, DataGridRowEventArgs args)
43+
{
44+
dataGrid.LoadingRow -= Handler;
45+
46+
dataGrid.Dispatcher.BeginInvoke(new Action(() =>
47+
{
48+
foreach (var column in dataGrid.Columns)
49+
{
50+
if (!column.Width.IsStar)
51+
continue;
52+
53+
var width = column.Width;
54+
column.Width = 0;
55+
column.Width = width;
56+
}
57+
}), DispatcherPriority.ContextIdle);
58+
}
59+
}
60+
}

Source/NETworkManager/Views/ConnectionsView.xaml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
xmlns:utilities="clr-namespace:NETworkManager.Utilities;assembly=NETworkManager.Utilities"
1212
xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization"
1313
xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls"
14-
xmlns:wpfHelper="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF"
14+
xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF"
1515
mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:ConnectionsViewModel}">
1616
<UserControl.InputBindings>
1717
<KeyBinding Key="F5" Command="{Binding RefreshCommand}" />
@@ -69,7 +69,7 @@
6969
Style="{StaticResource CleanButton}"
7070
Margin="0,0,10,0">
7171
<Rectangle Width="16" Height="16"
72-
wpfHelper:ReloadAnimationHelper.IsReloading="{Binding IsRefreshing}">
72+
wpfHelpers:ReloadAnimationHelper.IsReloading="{Binding IsRefreshing}">
7373
<Rectangle.OpacityMask>
7474
<VisualBrush Stretch="Uniform"
7575
Visual="{iconPacks:Material Kind=Refresh}" />
@@ -95,11 +95,13 @@
9595
Style="{StaticResource ResourceKey=SearchTextBox}" />
9696
</StackPanel>
9797
</Grid>
98-
<controls:MultiSelectDataGrid Grid.Column="0" Grid.Row="2"
98+
<controls:MultiSelectDataGrid x:Name="DataGridResults"
99+
Grid.Column="0" Grid.Row="2"
99100
ItemsSource="{Binding ResultsView}"
100101
SelectedItem="{Binding SelectedResult}"
101102
SelectedItemsList="{Binding SelectedResults, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
102-
Sorting="DataGrid_OnSorting">
103+
Sorting="DataGrid_OnSorting"
104+
wpfHelpers:DataGridHelper.RefreshStarColumnsOnFirstRow="True">
103105
<DataGrid.Resources>
104106
<ContextMenu x:Key="RowContextMenu" Opened="ContextMenu_Opened" MinWidth="150">
105107
<MenuItem Header="{x:Static localization:Strings.CopyDots}"
@@ -211,7 +213,8 @@
211213
SortMemberPath="ProcessName" MinWidth="150" />
212214
<DataGridTextColumn Header="{x:Static Member=localization:Strings.ProcessPath}"
213215
Binding="{Binding Path=(network:ConnectionInfo.ProcessPath)}"
214-
SortMemberPath="ProcessPath" MinWidth="150" />
216+
SortMemberPath="ProcessPath" MinWidth="150"
217+
Width="*" />
215218
</DataGrid.Columns>
216219
</controls:MultiSelectDataGrid>
217220
<WrapPanel Grid.Column="0" Grid.Row="4" Orientation="Horizontal"

Source/NETworkManager/Views/ConnectionsView.xaml.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections;
1+
using System;
2+
using System.Collections;
23
using System.ComponentModel;
34
using System.Windows;
45
using System.Windows.Controls;

Source/NETworkManager/Views/DNSLookupView.xaml

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models"
1313
xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization"
1414
xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls"
15+
xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF"
1516
Loaded="UserControl_Loaded"
1617
mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:DNSLookupViewModel}">
1718
<UserControl.Resources>
@@ -84,7 +85,7 @@
8485
<TextBlock Grid.Column="8" Grid.Row="0" Text="{x:Static localization:Strings.Type}"
8586
Style="{DynamicResource DefaultTextBlock}" VerticalAlignment="Center" />
8687
<ComboBox x:Name="ComboBoxTypes" Grid.Column="10" Grid.Row="0" ItemsSource="{Binding QueryTypes}"
87-
SelectedItem="{Binding QueryType}" Width="80" HorizontalAlignment="Left" />
88+
SelectedItem="{Binding QueryType}" Width="100" HorizontalAlignment="Left" />
8889
<Button Grid.Column="12" Grid.Row="0" Command="{Binding QueryCommand}"
8990
IsDefault="{Binding IsRunning, Converter={StaticResource BooleanReverseConverter}}"
9091
HorizontalAlignment="Right">
@@ -148,9 +149,11 @@
148149
Style="{DynamicResource StatusMessageTextBlock}" Margin="0,10,0,0" />
149150
</Grid>
150151
<TextBlock Grid.Row="2" Text="{x:Static localization:Strings.Result}" Style="{StaticResource HeaderTextBlock}" />
151-
<controls:MultiSelectDataGrid Grid.Row="3" ItemsSource="{Binding ResultsView}"
152+
<controls:MultiSelectDataGrid x:Name="DataGridResults" Grid.Row="3"
153+
ItemsSource="{Binding ResultsView}"
152154
SelectedItem="{Binding SelectedResult}"
153-
SelectedItemsList="{Binding SelectedResults, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
155+
SelectedItemsList="{Binding SelectedResults, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
156+
wpfHelpers:DataGridHelper.RefreshStarColumnsOnFirstRow="True">
154157
<controls:MultiSelectDataGrid.Resources>
155158
<ContextMenu x:Key="RowContextMenu" Opened="ContextMenu_Opened" MinWidth="150">
156159
<MenuItem Header="{x:Static Member=localization:Strings.CopyDots}"
@@ -254,7 +257,14 @@
254257
<DataGridTextColumn Header="{x:Static localization:Strings.Result}"
255258
Binding="{Binding Path=(network:DNSLookupRecordInfo.Result)}"
256259
SortMemberPath="Result"
257-
MinWidth="200" />
260+
MinWidth="200"
261+
Width="*">
262+
<DataGridTextColumn.ElementStyle>
263+
<Style>
264+
<Setter Property="TextBlock.TextWrapping" Value="Wrap" />
265+
</Style>
266+
</DataGridTextColumn.ElementStyle>
267+
</DataGridTextColumn>
258268
</controls:MultiSelectDataGrid.Columns>
259269
</controls:MultiSelectDataGrid>
260270
</Grid>

0 commit comments

Comments
 (0)