17

私はSilverlightWebアプリに取り組んでいます。SMSを送信するモジュールと相互作用します。テキストを160に制限して、カウンターを表示したいと思います。私はこのようにしました:

public partial class SendSMSView
{
    public SendSMSView()
    {
       InitializeComponent();
       ApplyTheme();
    }

    protected void tbMessage_KeyDown(object sender, KeyEventArgs e)
    {
        count = 160 - this.tbMessage.Text.Length;
        this.lblCount.Content = count.ToString();
    }
}

これは、バックスペースと削除を除くすべてのキーで正常に機能します。もちろんこのように機能するように作られています。これについてさらに掘り下げて、キーダウンイベントをオーバーライドしようとしたので、次のコードスニペットを追加しました。

public class CustomTextBox : TextBox
{
    public CustomTextBox(): base()
    {
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        e.handler=false;
        base.OnKeyDown(e);
        //this place
    }
}

OnKeyDown関数で、すべてのキーストロークを登録します。ここでハンドラーをfalseに設定しても効果はありませんが、バックスペースを取得してtbMessage_KeyDowをトリガーすることはできません。

どういうわけか、バックスペースのために//この場所からtbMessage_KeyDow関数を強制的に呼び出したいと思います。

MSDNを検索したところ、IsInputKeyをオーバーライドしてtrueを返すことができるため、onKeyDownもそれに応答することがわかりましたが、私のフレームワークにはIsInputKeyもPreviewKeyPressもありません。バックスペースキーを入力キーとして登録するための回避策、またはtbMessage_KeyDow [非常に大雑把なアプローチ]を呼び出すための回避策はありますか?助けてください。

4

3 に答える 3

13

これを試して ....

テキストボックスで押されたキーのバックスペースキーを検出する場合。KeyDownイベントの代わりにテキストボックスのKeyUpイベントで実行することをお勧めします。例えば:

   <TextBox x:Name="txt" KeyDown="txt_KeyDown" Text="Hello" KeyUp="txt_KeyUp"></TextBox>    

コードビハインド:

    private void txt_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Back)
        {
            MessageBox.Show(this.txt.Text);
        }
    } 

または、このようにすることができます...ユーザーコントロールを作成することによって...

public partial class Page : UserControl {

    private TextBox TextBox1;

    public Page() {
        InitializeComponent();
        TextBox1 = new TextBox();
        Width = 300;
        Height = 100;
        LayoutRoot.Children.Add(textbox);
        OnTextChanged(((object)(sender)), ((TextChangedEventArgs)(e)));
        TextBox1.TextChanged;
        if (e.Key == Key.Back) {
            e.Handled = true;
        }
        else if (e.Key == Key.Delete) {
            e.Handled = true;
        }
    }
}
于 2011-10-27T14:36:00.267 に答える
4

WPFアプリケーションに似たものを探していましたが、BackspaceキーとDeleteキーがKeyDownイベントによってキャッチされていませんでした。KeyUpイベントは機能しませんでした。アクションがすでに発生した後、キー押下をキャッチします。

ただし、PreviewKeyDownイベントがキー押下をキャプチャするように機能したため、次のようにキー押下が発生しないようにすることができました。

private void txtRight_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if ((e.Key == Key.Delete) || (e.Key == Key.Back))
    {
        // Stop the character from being entered into the control since it is illegal.
        e.Handled = true;
    }
}
于 2018-06-09T00:34:14.670 に答える
0

私はこのようなことをします(私の前にVSがないので、これは純粋なpseduoコードです)

public class SendSMSViewModel : INotifyPropertyChanged
{
   string _text;

   public string Text 
   { 
      get { return _text; }
      set {

          // or allow it and implement IDataErrorInfo to give the user a nifty error message          
          if (value != null & value.Length > 160)
              return;

          _text = value;
          OnPropertyChanged(vm => vm.Text);
          OnPropertyChanged(vm => vm.NumberOfCharactersRemaining);
     }
   }

   public string NumberOfCharactersRemaining 
   { 
       get { return Text == null ? 160 : 160 - Text.Length; }
   }
}

..次に、ビューから双方向のデータバインディングを使用し、バインディングで「PropertyChanged」のUpdateSourceTriggerを使用することを忘れないでください。

于 2011-10-27T18:42:13.693 に答える