Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
60 changes: 60 additions & 0 deletions Source/NETworkManager.Utilities.WPF/DataGridHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;

namespace NETworkManager.Utilities.WPF;

/// <summary>
/// Attached-property helpers for <see cref="DataGrid"/>.
/// </summary>
public static class DataGridHelper
{
/// <summary>
/// When set to <see langword="true"/>, forces star-sized columns to recompute their width after
/// the first row is realized. Without this, an initially empty <see cref="DataGrid"/> sizes star
/// columns to <c>MinWidth</c> because the inner <see cref="System.Windows.Controls.ScrollViewer"/>
/// measures with infinite width; only a window resize would otherwise trigger a correct re-measure.
/// The handler unsubscribes itself after the first row so there is no ongoing overhead.
/// </summary>
public static readonly DependencyProperty RefreshStarColumnsOnFirstRowProperty =
DependencyProperty.RegisterAttached(
"RefreshStarColumnsOnFirstRow",
typeof(bool),
typeof(DataGridHelper),
new PropertyMetadata(false, OnRefreshStarColumnsOnFirstRowChanged));

public static void SetRefreshStarColumnsOnFirstRow(DataGrid element, bool value) =>
element.SetValue(RefreshStarColumnsOnFirstRowProperty, value);

public static bool GetRefreshStarColumnsOnFirstRow(DataGrid element) =>
(bool)element.GetValue(RefreshStarColumnsOnFirstRowProperty);

private static void OnRefreshStarColumnsOnFirstRowChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if (d is not DataGrid dataGrid || e.NewValue is not bool enabled || !enabled)
return;

dataGrid.LoadingRow += Handler;
return;

void Handler(object sender, DataGridRowEventArgs args)
{
dataGrid.LoadingRow -= Handler;

dataGrid.Dispatcher.BeginInvoke(new Action(() =>
{
foreach (var column in dataGrid.Columns)
{
if (!column.Width.IsStar)
continue;

var width = column.Width;
column.Width = 0;
column.Width = width;
}
}), DispatcherPriority.ContextIdle);
}
}
}
13 changes: 8 additions & 5 deletions Source/NETworkManager/Views/ConnectionsView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
xmlns:utilities="clr-namespace:NETworkManager.Utilities;assembly=NETworkManager.Utilities"
xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization"
xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls"
xmlns:wpfHelper="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF"
xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF"
mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:ConnectionsViewModel}">
<UserControl.InputBindings>
<KeyBinding Key="F5" Command="{Binding RefreshCommand}" />
Expand Down Expand Up @@ -69,7 +69,7 @@
Style="{StaticResource CleanButton}"
Margin="0,0,10,0">
<Rectangle Width="16" Height="16"
wpfHelper:ReloadAnimationHelper.IsReloading="{Binding IsRefreshing}">
wpfHelpers:ReloadAnimationHelper.IsReloading="{Binding IsRefreshing}">
<Rectangle.OpacityMask>
<VisualBrush Stretch="Uniform"
Visual="{iconPacks:Material Kind=Refresh}" />
Expand All @@ -95,11 +95,13 @@
Style="{StaticResource ResourceKey=SearchTextBox}" />
</StackPanel>
</Grid>
<controls:MultiSelectDataGrid Grid.Column="0" Grid.Row="2"
<controls:MultiSelectDataGrid x:Name="DataGridResults"
Grid.Column="0" Grid.Row="2"
ItemsSource="{Binding ResultsView}"
SelectedItem="{Binding SelectedResult}"
SelectedItemsList="{Binding SelectedResults, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Sorting="DataGrid_OnSorting">
Sorting="DataGrid_OnSorting"
wpfHelpers:DataGridHelper.RefreshStarColumnsOnFirstRow="True">
<DataGrid.Resources>
<ContextMenu x:Key="RowContextMenu" Opened="ContextMenu_Opened" MinWidth="150">
<MenuItem Header="{x:Static localization:Strings.CopyDots}"
Expand Down Expand Up @@ -211,7 +213,8 @@
SortMemberPath="ProcessName" MinWidth="150" />
<DataGridTextColumn Header="{x:Static Member=localization:Strings.ProcessPath}"
Binding="{Binding Path=(network:ConnectionInfo.ProcessPath)}"
SortMemberPath="ProcessPath" MinWidth="150" />
SortMemberPath="ProcessPath" MinWidth="150"
Width="*" />
</DataGrid.Columns>
</controls:MultiSelectDataGrid>
<WrapPanel Grid.Column="0" Grid.Row="4" Orientation="Horizontal"
Expand Down
3 changes: 2 additions & 1 deletion Source/NETworkManager/Views/ConnectionsView.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections;
using System;
using System.Collections;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
Expand Down
18 changes: 14 additions & 4 deletions Source/NETworkManager/Views/DNSLookupView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models"
xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization"
xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls"
xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF"
Loaded="UserControl_Loaded"
mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:DNSLookupViewModel}">
<UserControl.Resources>
Expand Down Expand Up @@ -84,7 +85,7 @@
<TextBlock Grid.Column="8" Grid.Row="0" Text="{x:Static localization:Strings.Type}"
Style="{DynamicResource DefaultTextBlock}" VerticalAlignment="Center" />
<ComboBox x:Name="ComboBoxTypes" Grid.Column="10" Grid.Row="0" ItemsSource="{Binding QueryTypes}"
SelectedItem="{Binding QueryType}" Width="80" HorizontalAlignment="Left" />
SelectedItem="{Binding QueryType}" Width="100" HorizontalAlignment="Left" />
Comment thread
BornToBeRoot marked this conversation as resolved.
<Button Grid.Column="12" Grid.Row="0" Command="{Binding QueryCommand}"
IsDefault="{Binding IsRunning, Converter={StaticResource BooleanReverseConverter}}"
HorizontalAlignment="Right">
Expand Down Expand Up @@ -148,9 +149,11 @@
Style="{DynamicResource StatusMessageTextBlock}" Margin="0,10,0,0" />
</Grid>
<TextBlock Grid.Row="2" Text="{x:Static localization:Strings.Result}" Style="{StaticResource HeaderTextBlock}" />
<controls:MultiSelectDataGrid Grid.Row="3" ItemsSource="{Binding ResultsView}"
<controls:MultiSelectDataGrid x:Name="DataGridResults" Grid.Row="3"
ItemsSource="{Binding ResultsView}"
SelectedItem="{Binding SelectedResult}"
SelectedItemsList="{Binding SelectedResults, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
SelectedItemsList="{Binding SelectedResults, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
wpfHelpers:DataGridHelper.RefreshStarColumnsOnFirstRow="True">
<controls:MultiSelectDataGrid.Resources>
<ContextMenu x:Key="RowContextMenu" Opened="ContextMenu_Opened" MinWidth="150">
<MenuItem Header="{x:Static Member=localization:Strings.CopyDots}"
Expand Down Expand Up @@ -254,7 +257,14 @@
<DataGridTextColumn Header="{x:Static localization:Strings.Result}"
Binding="{Binding Path=(network:DNSLookupRecordInfo.Result)}"
SortMemberPath="Result"
MinWidth="200" />
MinWidth="200"
Width="*">
<DataGridTextColumn.ElementStyle>
<Style>
<Setter Property="TextBlock.TextWrapping" Value="Wrap" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</controls:MultiSelectDataGrid.Columns>
</controls:MultiSelectDataGrid>
</Grid>
Expand Down
Loading
Loading