2

次の例を参照してください。

<Window 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:src="clr-namespace:WpfApplication1"
  SizeToContent="WidthAndHeight">
  <Window.DataContext>
    <src:CodeName/>
  </Window.DataContext>
  <TextBox Text="{Binding Code, UpdateSourceTrigger=PropertyChanged}" />
</Window>

Imports System.ComponentModel
Public Class CodeName
  Implements INotifyPropertyChanged

  Private m_Code As String
  Public Property Code() As String
    Get
      Return m_Code
    End Get
    Set(ByVal value As String)
      If Not String.IsNullOrWhiteSpace(value) Then value = "_" & value
      m_Code = value
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Code"))
    End Set
  End Property

  Public Event PropertyChanged(ByVal sender As Object,
    ByVal e As PropertyChangedEventArgs) _
      Implements INotifyPropertyChanged.PropertyChanged
End Class

ご覧のとおり、編集した値を変更して、ユーザーがにテキストを入力すると、先頭にをTextBox追加して更新される_ようにしています。

何が起こるかというと、私123456789が結果を入力すると、期待どおりでTextBoxはあり_________987654321ません_________123456789

それを修正するためのきちんとした方法は何でしょうか?
KeyUpなどのイベントでカレットを動かしてコード全体を汚したくありません。
一方で、私はこれをエンティティレベルで実行したいと思っています。

注:私の「実際の」機能は、電話番号をダッシュ​​などでフォーマットしています。

4

2 に答える 2

0
Public Class TextBoxBehavor
Public Shared Function GetMoveCaretOnTextChange(ByVal element As TextBox) As Boolean
  If element Is Nothing Then Throw New ArgumentNullException("element")
  Return element.GetValue(MoveCaretOnTextChangeProperty)
End Function
Public Shared Sub SetMoveCaretOnTextChange(ByVal element As TextBox, ByVal value As Boolean)
  If element Is Nothing Then Throw New ArgumentNullException("element")
  element.SetValue(MoveCaretOnTextChangeProperty, value)
End Sub
Public Shared ReadOnly MoveCaretOnTextChangeProperty As DependencyProperty =
  DependencyProperty.RegisterAttached("MoveCaretOnTextChange",
    GetType(Boolean), GetType(TextBoxBehavior),
    New FrameworkPropertyMetadata(
      New PropertyChangedCallback(AddressOf MoveCaretOnTextChange_PropertyChanged)))

Private Shared Sub MoveCaretOnTextChange_PropertyChanged(ByVal sender As Object,
  ByVal e As DependencyPropertyChangedEventArgs)
  Dim tb = DirectCast(sender, TextBox)
  Static tb_TextChanged As TextChangedEventHandler =
    Sub(obj, tcea)
      Dim textBox = DirectCast(obj, TextBox)
      textBox.CaretIndex = textBox.Text.Length
    End Sub

  If CBool(e.NewValue) Then
    AddHandler tb.TextChanged, tb_TextChanged
  Else
    RemoveHandler tb.TextChanged, tb_TextChanged
  End If
End Sub
End Class

使用法:

<TextBox src:TextBoxBehavior.MoveCaretOnTextChange="True"
  xmlns:src="clr-namespace:WpfApplication1" />
于 2010-12-17T10:32:15.653 に答える
0

次のように、テキストボックスのtextchangedイベントを使用して、キャレットを最後に移動します。

 <TextBox Name="textBox1" Text="{Binding Code, UpdateSourceTrigger=PropertyChanged}" TextChanged="textChangedEventHandler"/>


Private Sub textChangedEventHandler(ByVal sender As Object, ByVal args As TextChangedEventArgs)
   textBox1.CaretIndex = textBox1.Text.Length
End Sub
于 2010-12-17T08:39:22.033 に答える