WPF の TextBox や RichTextBox で既に入力済みの文字列を編集や削除できないようにすることは可能でしょうか?
TextBox や RichTextBox にすでに入力されている部分を編集できなくしてそれ以外に部分を入力可能にしたいです。
つまり、時系列のように過去に入力された文を残し、その上または下にテキストを追加していくようにしたいです。
既に存在する文を保護したいです。
よろしくお願いします。
Windows10 VS2015 C# WPF
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
あんまりいい UI では無いと思いますが、入力済みテキストと新規入力用の BorderThickness を 0 にしたテキストボックスを縦に並べれば、それっぽく見えます。
XAML
1<DockPanel LastChildFill="True"> 2 <TextBox Text="{Binding SavedText, Mode=OneWay}" DockPanel.Dock="Top" 3 BorderThickness="0" 4 TextWrapping="Wrap" 5 VerticalContentAlignment="Top" 6 IsReadOnly="True" 7 /> 8 <TextBox Text="{Binding InputText}" 9 BorderThickness="0" 10 AcceptsReturn="True" 11 TextWrapping="Wrap" 12 VerticalContentAlignment="Top" 13 /> 14</DockPanel>
投稿2020/07/14 04:27
総合スコア2577
0
byoriさんの要件と厳密には合致していないかもしれませんが、ひとつ手軽にできる方法があります。
1文字入力ごとに「新しい文字列が古い文字列と同じ文字列で始まっている」もしくは「新しい文字列が古い文字列と同じ文字列で終わっている」時だけ入力を受け付けるようにします。
xml
1<Window 2 x:Class="Questions277480.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="800" 6 Height="450"> 7 <Grid> 8 <TextBox 9 AcceptsReturn="True" 10 AcceptsTab="True" 11 Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" /> 12 </Grid> 13</Window>
cs
1using System.ComponentModel; 2using System.Runtime.CompilerServices; 3using System.Windows; 4 5namespace Questions277480 6{ 7 public partial class MainWindow : Window, INotifyPropertyChanged 8 { 9 public string Text 10 { 11 get 12 { 13 return _Text; 14 } 15 16 set 17 { 18 if(value.StartsWith(_Text) || value.EndsWith(_Text)) 19 Set(ref _Text, value); 20 } 21 } 22 private string _Text = "abcd"; // 初期値をカラにしたい場合 _Text = "";で (_Text;だとArgumentNullExceptionが出る) 23 24 public MainWindow() 25 { 26 InitializeComponent(); 27 DataContext = this; 28 } 29 30 #region INotifyPropertyChanged 31 public event PropertyChangedEventHandler PropertyChanged; 32 protected bool Set<T>(ref T storage, T value, [CallerMemberName] string propertyName = null) 33 { 34 if(Equals(storage, value)) return false; 35 storage = value; 36 OnPropertyChanged(propertyName); 37 return true; 38 } 39 protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 40 { 41 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 42 } 43 #endregion 44 } 45} 46
気になる点
BackSpace
やEnter
の動きがちょっと変- (
abcd
と表示されていたとする)aとbの間にカーソルがあったとき、aが入力できてしまう。bと入力するとカーソルがひとつ進む。 RichTextBox
ではこの手は使えない
投稿2020/07/14 09:17
編集2023/07/22 09:13総合スコア9862
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/15 02:08
2020/07/15 02:52
2020/07/15 04:26
0
出来ません。
画面構成で解決するか、もっとリッチなコントロールを使う必要があります。
後者の例として、AvalonEditなら~~TextArea毎にIsEnabledが設定できます。~~ItemsControlを内包しているので、Styleなどの設定で解決できそうです。
AvalonEditはとても高機能な反面、すごく複雑なので私も部分的にしか使えてませんが…
投稿2020/07/14 04:24
編集2020/07/14 04:37総合スコア4152
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。