Skip to content

Commit

Permalink
added AutoSizedGridView
Browse files Browse the repository at this point in the history
  • Loading branch information
djonasdev committed Feb 10, 2020
1 parent 83b48c1 commit ed1a6a2
Show file tree
Hide file tree
Showing 11 changed files with 337 additions and 92 deletions.
2 changes: 1 addition & 1 deletion src/NLogViewer.TestApp/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="Target 1" FontSize="18"></TextBlock>
<dj:NLogViewer Grid.Row="2" MaxCount="1000" TargetName="target1"/>
<dj:NLogViewer x:Name="NLogViewer1" Grid.Row="2" MaxCount="1000" TargetName="target1"/>
<TextBlock Grid.Row="4" Text="Target 2 (Warn and Error)" FontSize="18"></TextBlock>
<dj:NLogViewer Grid.Row="6" MaxCount="1000" TargetName="target2"/>
</Grid>
Expand Down
13 changes: 13 additions & 0 deletions src/NLogViewer.TestApp/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Reactive.Linq;
using System.Windows;
using DJ.Resolver;
using NLog;

namespace TestApplication
Expand All @@ -17,6 +18,10 @@ public MainWindow()
{
Title = $"Testing v{AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName}";
InitializeComponent();
DataContext = this;

NLogViewer1.TimeStampResolver = new FooTimeStampResolver();

Random random = new Random();
Observable.Interval(TimeSpan.FromMilliseconds(250)).ObserveOnDispatcher().Subscribe(l =>
{
Expand Down Expand Up @@ -53,4 +58,12 @@ public MainWindow()
});
}
}

public class FooTimeStampResolver : ILogEventInfoResolver
{
public string Resolve(LogEventInfo logEventInfo)
{
return logEventInfo.TimeStamp.ToUniversalTime().ToString();
}
}
}
23 changes: 23 additions & 0 deletions src/NLogViewer/Helper/AutoSizedGridView.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Windows.Controls;

namespace DJ.Helper
{
/// <summary>
/// Represents a view mode that displays data items in columns for a System.Windows.Controls.ListView control with auto sized columns based on the column content
/// Used to fix the column width: https://stackoverflow.com/questions/60147905/column-width-adjustment-is-broken-if-using-multibinding-on-displaymemberbinding
/// </summary>
public class AutoSizedGridView : GridView
{
protected override void PrepareItem(ListViewItem item)
{
foreach (GridViewColumn column in Columns)
{
//setting NaN for the column width automatically determines the required width enough to hold the content completely.
//if column width was set to NaN already, set it ActualWidth temporarily and set to NaN. This raises the property change event and re computes the width.
if (double.IsNaN(column.Width)) column.Width = column.ActualWidth;
column.Width = double.NaN;
}
base.PrepareItem(item);
}
}
}
154 changes: 92 additions & 62 deletions src/NLogViewer/NLogViewer.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
xmlns:dj="clr-namespace:DJ"
xmlns:nLog="clr-namespace:NLog;assembly=NLog"
xmlns:listViewLayoutManager="clr-namespace:DJ.Helper.ListViewLayoutManager"
xmlns:xamlMultiValueConverter="clr-namespace:DJ.XamlMultiValueConverter"
xmlns:helper="clr-namespace:DJ.Helper"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
Expand Down Expand Up @@ -66,10 +68,13 @@
BorderThickness="0"
ScrollViewer.CanContentScroll="True"
listViewLayoutManager:ListViewLayoutManager.Enabled="true">
<ListView.Resources>
<xamlMultiValueConverter:ILogEventResolverToStringConverter x:Key="ILogEventResolverToStringConverter"/>
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="1" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Trace}">
Expand Down Expand Up @@ -117,66 +122,91 @@
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="ID" DisplayMemberBinding="{Binding Path=SequenceID}" Width="40"/>
<GridViewColumn Header="Level" Width="Auto">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image x:Name="Image" RenderOptions.BitmapScalingMode="Linear"
Height="18" VerticalAlignment="Center" HorizontalAlignment="Center" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Trace}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Trace.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Debug}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Debug.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Info}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Info.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Warn}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Warning.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Error}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Error.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Fatal}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Fatal.png" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="TimeStamp"
DisplayMemberBinding="{Binding Path=TimeStamp, StringFormat=\{0:dd-MM-yyyy hh:mm:ss.fff \}}"
Width="Auto"/>
<GridViewColumn Header="LoggerName" DisplayMemberBinding="{Binding Path=LoggerName}" Width="Auto"/>
<GridViewColumn Header="Message" Width="Auto" listViewLayoutManager:RangeColumn.IsFillColumn="True">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox
IsReadOnly="True"
Background="Transparent"
BorderThickness="0"
TextWrapping="Wrap"
Foreground="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListViewItem}, Path=Foreground}"
Text="{Binding Path=FormattedMessage, Mode=OneWay}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
<helper:AutoSizedGridView>
<GridViewColumn Header="ID" Width="40">
<GridViewColumn.DisplayMemberBinding>
<MultiBinding Converter="{StaticResource ILogEventResolverToStringConverter}">
<Binding Path="."/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=dj:NLogViewer}" Path="IdResolver"/>
</MultiBinding>
</GridViewColumn.DisplayMemberBinding>
</GridViewColumn>
<GridViewColumn Header="Level" Width="Auto">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image x:Name="Image" RenderOptions.BitmapScalingMode="Linear"
Height="18" VerticalAlignment="Center" HorizontalAlignment="Center" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Trace}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Trace.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Debug}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Debug.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Info}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Info.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Warn}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Warning.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Error}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Error.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Level}"
Value="{x:Static nLog:LogLevel.Fatal}">
<Setter TargetName="Image" Property="Source"
Value="Images/Small/Fatal.png" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="TimeStamp" Width="Auto">
<GridViewColumn.DisplayMemberBinding>
<MultiBinding Converter="{StaticResource ILogEventResolverToStringConverter}">
<Binding Path="."/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=dj:NLogViewer}" Path="TimeStampResolver"/>
</MultiBinding>
</GridViewColumn.DisplayMemberBinding>
</GridViewColumn>
<GridViewColumn Header="LoggerName" Width="Auto">
<GridViewColumn.DisplayMemberBinding>
<MultiBinding Converter="{StaticResource ILogEventResolverToStringConverter}">
<Binding Path="."/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=dj:NLogViewer}" Path="LoggerNameResolver"/>
</MultiBinding>
</GridViewColumn.DisplayMemberBinding>
</GridViewColumn>
<GridViewColumn Header="Message" Width="Auto" listViewLayoutManager:RangeColumn.IsFillColumn="True">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox
IsReadOnly="True"
Background="Transparent"
BorderThickness="0"
TextWrapping="Wrap"
Foreground="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListViewItem}, Path=Foreground}">
<TextBox.Text>
<MultiBinding Converter="{StaticResource ILogEventResolverToStringConverter}">
<Binding Path="." Mode="OneWay"/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=dj:NLogViewer}" Path="MessageResolver"/>
</MultiBinding>
</TextBox.Text>
</TextBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</helper:AutoSizedGridView>
</ListView.View>
</ListView>
</Grid>
Expand Down
Loading

0 comments on commit ed1a6a2

Please sign in to comment.