🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

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

Q&A

解決済

2回答

5096閲覧

WPF TextBoxの行数制限のため、コードでBackSpaceキーの入力を行いたい

popaii

総合スコア10

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

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

1グッド

0クリップ

投稿2020/11/27 08:34

編集2020/11/30 08:23

前提・実現したいこと

分かりづらいタイトルで申し訳ありません。
長文失礼いたします。

TextBoxの行数に制限をかけるため、コードでBackSpaceキーの入力を行いたいです。

TextBoxの現状としては以下の通りです。
・行数は最大6行
・FontSizeは変更しない
・最大文字数は102文字
・Textは折り返す
・最大行数を超えるEnterキーでの改行を制限

最大行数を超えるような改行は起きないのですが
下図のように6行目がいっぱいの状態で文字を入力すると
折り返され7行目に文字が表示されてしまいます
TextBox

なので、6行目でテキストの折り返しが起きた場合にコードでBackSpaceキーの入力を行い、入力された文字を消去したいです。

WPF –キーの送信|michlGのブログ
WPFアプリケーションでSendKeys.Sendメソッドを使用する

↑これらのサイトを参考に以下のコードを作成したのですが、動作自体は実行されているものの、なにも起きませんでした。

BackSpaceキーの入力がうまく行われない原因、もしくはより良い行数制限の方法がもしあればご教授いただけると幸いです。

該当のソースコード

XAML

1<TextBox x:Name="TextBox"TextWrap="Wrap" AcceptsReturn="True" MaxLength="102" 2 TextWrapping="Wrap"PreviewKeyDown="TextBoxKeyDown"PreviewKeyUp="TextBoxKeyDown"/>

C#

1 2int MaxLine =6; 3 4// TextBoxに改行制限をかける 5 private void TextBoxKeyDown(object sender, KeyEventArgs e) 6 { 7 if(this.InputMyALittleExcitedText.LineCount == MaxLine) 8 { 9 if(e.Key == Key.Enter) 10 { 11 e.Handled = true; 12 } 13 14 } 15 else if (this.InputMyALittleExcitedText.LineCount > MaxLine) 16 { 17 SendKeys.Send(Key.Back); 18 } 19 } 20 21 public static class SendKeys 22 { 23 /// <summary> 24 /// Sends the specified key. 25 /// </summary> 26 /// <param name="key">The key.</param> 27 public static void Send(Key key) 28 { 29 if (Keyboard.PrimaryDevice != null) 30 { 31 if (Keyboard.PrimaryDevice.ActiveSource != null) 32 { 33 var e1 = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Down) { RoutedEvent = Keyboard.KeyDownEvent}; 34 InputManager.Current.ProcessInput(e1); 35 } 36 } 37 } 38 }
TN8001👍を押しています

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

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

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

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

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

guest

回答2

0

こんばんは。

少し調べてみましたが、以下のリンクがドンピシャでした。
TextBoxで行数を制限したい

余談ですが、WPFで開発される場合は設計思想としてMVVMパターンを採用するのが一般的です。
コードが綺麗になるのでお勧めします。

投稿2020/11/27 09:54

Automatic9045

総合スコア313

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

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

popaii

2020/11/30 09:01

ご回答いただきありがとうございます。 リンク先を参考にしたところ、自分のやりたいことに近づきました。 MVVMパターンに苦手意識があるのですが、ただいま作っているアプリが大きくなってきましたので今後検討したいと考えています。
guest

0

ベストアンサー

BackSpaceを送るといいながら、Key.Backがどこにもなくないですか?(まあリンク先が不親切なんですが^^;

このあたりは詳しくありませんが、Key.Backを送れば何となく動いてる気はします。

cs

1using System.Windows; 2using System.Windows.Controls; 3using System.Windows.Input; 4 5namespace Questions306813 6{ 7 public partial class MainWindow : Window 8 { 9 private readonly int MaxLine = 6; 10 11 public MainWindow() => InitializeComponent(); 12 13 private void TextBoxKeyDown(object sender, KeyEventArgs e) 14 { 15 if (TextBox.LineCount == MaxLine) 16 { 17 if (e.Key == Key.Enter) e.Handled = true; 18 } 19 else if (TextBox.LineCount > MaxLine) 20 { 21 Send(Key.Back); 22 } 23 } 24 25 private void Send(Key key) 26 { 27 if (Keyboard.PrimaryDevice != null) 28 { 29 if (Keyboard.PrimaryDevice.ActiveSource != null) 30 { 31 var e1 = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, key) 32 { 33 RoutedEvent = KeyDownEvent, 34 }; 35 InputManager.Current.ProcessInput(e1); 36 } 37 } 38 } 39 } 40}

投稿2020/11/27 09:53

編集2023/07/25 13:24
TN8001

総合スコア9855

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

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

popaii

2020/11/30 09:05

ご回答いただきありがとうございます。 質問文にあるソースコードに誤りがあったため一部訂正しました。 Key.Backを送ったときに、PreviewKeyDownイベントが反応したので、BackSpaceの入力自体はされていると思うのですが、文字が消えませんでした。 またEnterキーといった他のキーも上記と同じように送ってみたのですが TextBoxにフォーカスはあたっているもののキーの入力自体は確認できたが結果が反映されないといった状況です。 もし、何か原因など心当たりがあれば教えて頂けると幸いです。
TN8001

2020/11/30 10:06

>リンク先が不親切なんですが^^; が通じてなかったですか^^; ええとSendKeysの var e1 = new KeyEventArgs(..., ..., 0, Key.Down) { ...}; この行が間違っています。 引数のkeyを送るように見えて、常にKey.Down(↓キー)を送っています。
popaii

2020/11/30 11:06

すみません。確認不足でした... 詳しい解説ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問