【wpf】TextBoxでログ出力スクロールバー表示で更新時、末尾を表示

C#.NET

ad2

【wpf】TextBoxでログ出力スクロールバー表示で更新時、末尾を表示

 

ログ出力用のTextBoxを配置し、スクロールバーAutoで常に最新のログ行を表示させる方法

まずは、画面上にグリッドを作成してテキストボックスとボタンを配置するための枠を作ります。
MainWindow.xaml デザイン
<NavigationWindow x:Class="tameshi01.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:tameshi01"
        mc:Ignorable="d"
        Title="TEST" Height="500" Width="700" Source="home.xaml">
</NavigationWindow>
MainWindow.xaml ソースコード
次に、ログ出力の文字列を表示させるテキストボックスを作成して、任意の名前を設定する。
ボタンを作成してボタンの名前を「ログボタン1」,「ログボタン2」と設定します。
home.xaml 画面デザイン
xamlファイルのコードは下記の通りで、Gridを配置して、その中を行列で行2行、列2列のグリッドを設定。
TextBoxは、2行分を統合して一つのTextBoxにしてあります。
column(列)=1列のRow(行)=0行の位置にbuttonを設置、column(列)=1のRow(行)=0の位置にbutton2を設置、
<Page x:Class="tameshi01.home"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:tameshi01"
      mc:Ignorable="d" 
      d:DesignHeight="500" d:DesignWidth="700"
      Title="home" Loaded="Page_Loaded">
      <Grid>
         <Grid.ColumnDefinitions>
           <ColumnDefinition Width="2*" />
           <ColumnDefinition Width="1*" />
         </Grid.ColumnDefinitions>
         <Grid.RowDefinitions>
           <RowDefinition Height="1*" />
           <RowDefinition Height="1*" />
         </Grid.RowDefinitions>
         <TextBox x:Name="log_text" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" VerticalScrollBarVisibility="Auto" />
         <Button x:Name="log_button" Grid.Column="1" Grid.Row="0" Click="logbuton" Content="ログボタン1"/
         <Button x:Name="log_button2" Grid.Column="1" Grid.Row="1" Click="logbuton2" Content="ログボタン2" />
      </Grid>
</Page>
home.xaml ソースコード
今回は、テキストボックスの名前は「log_text」、
ボタン1の名前は「log_button」、
ボタン2に名前は「log_button2」としておきます。
テキストボックスは、スクロールバーを自動に設定する。「VerticalScrollBarVisibility=”Auto”」
こんどはボタンをクリックしたときのイベント処理を書いていきます。
ボタンのプロパティ画面のイベント用の稲妻マークのタブを表示してClick項目をダブルクリックすると自動でイベントメソッドを作成してくれます。
では、処理を書いていきます。
テキストボックスに表示したいログ内容を設定します。
using System.Windows;
using System.Windows.Controls;
namespace tameshi01
{
    public partial class home : Page
    {
        public home()
        {
            InitializeComponent();
        }
        private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            writeLog("テスト文字列1");
            writeLog("テスト文字列2");
        }
        public void writeLog(string text)
        {
            log_text.AppendText("[" + System.DateTime.Now.ToString() + "]" + text + "\r\n");
            log_text.ScrollToEnd();
        }
        private void logbuton(object sender, RoutedEventArgs e)
        {
            writeLog("テスト文字列3");
            writeLog("テスト文字列4");
        }
        private void logbuton2(object sender, RoutedEventArgs e)
        {
            writeLog("テスト文字列5");
            writeLog("テスト文字列6");
        }
    }
}
home.xaml.cs ソースコード
今回は、現在時刻とボタンをクリックした旨を出力したいと思います。
writeLogメソッドで、”[現在時刻(DateTime.Now)]” + (出力する文字列) + “\r\n”(改行) のひな型を作っておきます。
では、実際に実行したらどうなるのかをお見せします。

ログボタン1を押下時

ログボタン2を押下時

という出力内容になります。

スクロールバーの表示時&常に最終行が表示される時

テキストボックスでの画面上一杯になるまでボタンを押下させてあげると、スクロールバーが自動で表示され、最終行を常に選択してくれるような挙動になりました。

スポンサードリンク

まとめ

テキストボックスにボタンがクリックされたら追記していく形でテキストボックスの枠を超えた場合、スクロールバーが表示され最終行を表示してくれるように、ScrollToEnd()を追加してあげます。
こんな感じて、ログ内容が流れるようなテキストボックスが表示できました。
誰かの開発の手助けになれたなら幸いです。