質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

3回答

3220閲覧

TextBox や RichTextBox で既に入力済みの文字列を編集や削除できないようにしたい

byori

総合スコア72

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/07/14 03:17

WPF の TextBox や RichTextBox で既に入力済みの文字列を編集や削除できないようにすることは可能でしょうか?

TextBox や RichTextBox にすでに入力されている部分を編集できなくしてそれ以外に部分を入力可能にしたいです。

つまり、時系列のように過去に入力された文を残し、その上または下にテキストを追加していくようにしたいです。
既に存在する文を保護したいです。

よろしくお願いします。

Windows10 VS2015 C# WPF

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

draq

総合スコア2577

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

byori

2020/07/15 04:32

テキストボックスの組み合わせで、それっぽく見せるのもいいですね。 TN8001さん、draqさんの案内を考えてみます。 ありがとうございます。
guest

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

気になる点

  • BackSpaceEnterの動きがちょっと変
  • abcdと表示されていたとする)aとbの間にカーソルがあったとき、aが入力できてしまう。bと入力するとカーソルがひとつ進む。
  • RichTextBoxではこの手は使えない

投稿2020/07/14 09:17

編集2023/07/22 09:13
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

byori

2020/07/15 02:08

お世話になります。 public string Text { get => _Text; set { if (value.StartsWith(_Text) || value.EndsWith(_Text)) Set(ref _Text, value); } } 現在のコンテキストに'set'という名前は存在しません 値を返さないコードパスがあります。 というエラーになり確認できませんでした。
TN8001

2020/07/15 02:52

編集しました。これでどうでしょうか?
byori

2020/07/15 04:26

確認できました。修正いただきありがとうございます。 「気になる点」があるようなので、使用するには手を加える必要があるようですが、_Text にセットした初期文字を編集できない、という方法を利用したいですね。
guest

0

出来ません。

画面構成で解決するか、もっとリッチなコントロールを使う必要があります。

後者の例として、AvalonEditなら~~TextArea毎にIsEnabledが設定できます。~~ItemsControlを内包しているので、Styleなどの設定で解決できそうです。
AvalonEditはとても高機能な反面、すごく複雑なので私も部分的にしか使えてませんが…

投稿2020/07/14 04:24

編集2020/07/14 04:37
hihijiji

総合スコア4152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

byori

2020/07/14 07:22

お世話になります。 AvalonEdit を使った方法のサンプルのようなものありませんか? Style で可能なのでしょうか?
hihijiji

2020/07/14 08:03

サンプルはググってくだされ > 時系列のように過去に入力された文を残し って要件が既にかなり上級者向けなので、それなりの物をお勧めしました。 初心者ならばdraqさんの方法を推します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問