private/OTP-UI.xaml

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="OTP Codes" Height="500" Width="1000" WindowStartupLocation="CenterScreen">
    <Window.Resources>
        <Style TargetType="DataGrid">
            <Setter Property="FontSize" Value="16"/>
            <Setter Property="EnableRowVirtualization" Value="True"/>
            <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
            <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
            <Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="True"/>
        </Style>
        <Style TargetType="TextBlock">
            <Setter Property="FontSize" Value="16"/>
        </Style>
        <Style TargetType="Button">
            <Setter Property="FontSize" Value="16"/>
            <Setter Property="Padding" Value="15,5"/>
            <Setter Property="Margin" Value="5"/>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
         
        <TextBlock Grid.Row="0" Margin="10,10" FontSize="24" FontWeight="Bold">
            One-Time Password Codes
        </TextBlock>
 
        <DataGrid Grid.Row="1" Name="CodesGrid" Margin="10"
                  AutoGenerateColumns="False" IsReadOnly="True"
                  EnableRowVirtualization="True"
                  VirtualizingStackPanel.IsVirtualizing="True"
                  VirtualizingStackPanel.VirtualizationMode="Recycling"
                  ScrollViewer.IsDeferredScrollingEnabled="True">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Tag" Binding="{Binding TagDisplay}" Width="150">
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding TagDisplay}" Value="">
                                    <Setter Property="Visibility" Value="Collapsed"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Header="Code" Binding="{Binding Code}" Width="100">
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="TextBlock">
                            <Setter Property="FontWeight" Value="Bold"/>
                            <Setter Property="FontSize" Value="16"/>
                            <Setter Property="Padding" Value="4,0,0,0"/>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
                <DataGridTextColumn Header="Algorithm" Binding="{Binding Algorithm}" Width="100"/>
                <DataGridTextColumn Header="Hash" Binding="{Binding HashAlgorithm}" Width="100"/>
                <DataGridTextColumn Header="Seed" Binding="{Binding Seed}" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
 
        <StackPanel Grid.Row="2" Orientation="Horizontal" Margin="10,10">
            <Button Name="RefreshButton" Content="Refresh Codes"/>
            <TextBlock Text="Next update in: " VerticalAlignment="Center" Margin="15,0"/>
            <TextBlock Name="TimerText" Text="30" VerticalAlignment="Center" FontWeight="Bold"/>
            <TextBlock Text=" seconds" VerticalAlignment="Center"/>
        </StackPanel>
    </Grid>
</Window>