PowerShell RichTextBox ScrollToCaret

PowerShell RichTextBox ScrollToCaret

所以我对在 PowerShell 中构建表单还很陌生;我已经尝试过 Saipen PowerShell Studio 但无法继续使用它,所以我坚持使用 ICE 并自己完成所有繁重的工作 - 当我遇到以前从未见过的事情时,这可能会很痛苦。
在本例中,我有一个要自动滚动的 RichTextBox。我已经在整个互联网上看到了 C# 的 ScrollToCaret,并且 Saipen 论坛建议使用它,但是在这两种情况下都没有提供完整的 PS 代码,所以我不知道把它放在哪里。无论我在哪里尝试,我都没有得到任何地方。

任何帮助将不胜感激。我也会就我是否有效地做事听取一般性建议。是的,我知道 GUI 很丑,只是因为它缺少与此问题无关的所有内容。

# Adds .NET assemby's and turns on visual themes in standard PowerShell.
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()


Function OpenFileDialog { 
  [System.Reflection.Assembly]::LoadWithPartialName( "System.Windows.Forms" ) | Out-Null
  $OBJFORM           = New-Object System.Windows.Forms.OpenFileDialog
  $OBJFORM.Filter    = "Text files (*.txt)|*.txt"
  $TXTIMPORT         = $OBJFORM.ShowDialog()

  IF ( $TXTIMPORT -eq "OK" )
     { Return $OBJFORM.FileName } }

 Function WriteFile {
   $LINES  = gc $TAB1IMPORT
   $TAB1TEXT.AppendText( "`nGet-Content $TAB1IMPORT" )

   foreach ( $LINE in $LINES )
           { $TAB1TEXT.AppendText( "`n$LINE" )
             Sleep 1 } }



# Creates the parent form and controls
$SDC                  = New-Object System.Windows.Forms.Form
$SDC.Location         = New-Object System.Drawing.Size( 270,175 )
$SDC.Size             = New-Object System.Drawing.Size( 900,600 )
$SDC.StartPosition    = "CenterScreen"
$SDC.BackColor        = "Lavender"
$SDC.Font             = "Calibri, 8.5"
$SDC.FormBorderStyle  = "Fixed3D"

$TABC                 = New-Object System.Windows.Forms.TabControl
$TABC.Location        = New-Object System.Drawing.Size( 140,20 )
$TABC.Size            = New-Object System.Drawing.Size( 720,520 )
$TABC.SizeMode        = "Fixed"
$SDC.Controls.Add( $TABC )

# Tab controls
$TAB1                 = New-Object System.Windows.Forms.TabPage
$TAB1.Location        = New-Object System.Drawing.Size( 20,20 )
$TAB1.Size            = New-Object System.Drawing.Size( 100,100 )
$TAB1.Text            = "Migrate Users"
$TABC.Controls.Add( $TAB1 )

#Tab open file button
$TAB1BUTTON           = New-Object System.Windows.Forms.Button
$TAB1BUTTON.Location  = New-Object System.Drawing.Size( 50,270 )
$TAB1BUTTON.Size      = New-Object System.Drawing.Size( 80,20 ) 
$TAB1BUTTON.Text      = "File Import"
$TAB1.Controls.Add( $TAB1BUTTON )

$TAB1BUTTON.Add_Click( { $TAB1IMPORT    = OpenFileDialog
                         $TAB1TEXT.Text = $TAB1TEXT.Text.Clear
                         $TAB1TEXT.AppendText( "PS H:\>$TAB1IMPORT" )
                         WriteFile } )

#Tab 1 Text Box
$TAB1TEXT             = New-Object System.Windows.Forms.RichTextBox
$TAB1TEXT.Location    = New-Object System.Drawing.Size( 50,300 )
$TAB1TEXT.Size        = New-Object System.Drawing.Size( 615,180 )
$TAB1TEXT.Font        = New-Object System.Drawing.Font( "Consolas",10,[System.Drawing.FontStyle]::Bold ) 
$TAB1TEXT.BackColor   = "Black"
$TAB1TEXT.ForeColor   = "White"
$TAB1TEXT.Multiline   = $TRUE
$TAB1TEXT.Text        = "PS H:\>"
$TAB1TEXT.BorderStyle = "FixedSingle"
$TAB1.Controls.add( $TAB1TEXT )


$SDC.Add_Shown( { $SDC.Activate() } )
$SDC.ShowDialog()

WriteFile 函数中使用 ScrollToCaret 方法

 Function WriteFile {
   $LINES  = gc $TAB1IMPORT
   $TAB1TEXT.AppendText( "`nGet-Content $TAB1IMPORT" )

   foreach ( $LINE in $LINES )
           { $TAB1TEXT.AppendText( "`n$LINE" )
             $TAB1TEXT.ScrollToCaret()             # here
             Sleep 1 } }

edit - 我遇到过很多次,其中提供了 c# 解决方案但没有 PowerShell 语法。你和这个太接近了……我通过使用制表符完成找到了解决方案。

更好的方法是让用户 Get-Member 查看对象上可用的方法。这会列出 ScrollToCaret 并为您提供方法定义:

  • void ... - return 什么都没有
  • ...() - 空括号所以不需要参数

$TAB1TEXT | Get-Member


一般在 Powershell 中使用 c# - helpful link

调用静态方法

[Class]::StaticMethod(args)

调用实例方法

$object.InstanceMethod(args)

获得属性

$object.Property