【问题标题】:Silverlight textbox overridesSilverlight 文本框覆盖
【发布时间】:2009-05-22 17:19:10
【问题描述】:

我正在尝试获取一个文本框 keydown 事件来捕获退格键按下事件。我通过添加一个覆盖文本框的类来实现这一点。我不知道该怎么做是与文本框在用户控件中的类进行通信。

当用户在文本框中键入...说 abcd 或退格时,我需要更新用户控件上的某些内容。假设我想要显示文本框中有多少个字符的东西。有人可以帮我吗?这是我到目前为止所拥有的

Option Strict On
Imports System.Text.RegularExpressions

Partial Public Class Page
    Inherits UserControl

    Public Sub New()
        InitializeComponent()
        Dim textbox As New MyTextBox() With {.Width = 300, .Height = 100}
        LayoutRoot.Children.Add(textbox)
    End Sub
End Class

Public Class MyTextBox
    Inherits TextBox
    Protected Overrides Sub OnKeyDown(ByVal e As KeyEventArgs)
        MyBase.OnKeyDown(e)
        If e.Key = Key.Back Then
            e.Handled = True
            MyBase.OnKeyDown(e)

        ElseIf e.Key = Key.Delete Then
            e.Handled = True
            MyBase.OnKeyDown(e)
        End If
    End Sub
End Class

谢谢 香农

【问题讨论】:

  • 关于这一点的另一件事是你有两个具有相同代码的“如果”条件。如果您只是在其中放一个“或”,这样代码就不会重复(例如,如果 e.Key = Key.Back OrElse e.Key = Key.Delete...我认为您就是这样做的它在VB中)
  • 你有没有想过这个问题?

标签: silverlight keydown


【解决方案1】:

您不需要子类化TextBox 来执行此操作。相反,在 UserControl 类中添加 TextBox.TextChanged 事件的处理程序。当它被调用时,事件的发送者应该是你的TextBox。然后,您可以从中获取文本并做您需要做的事情。

更新:根据评论,以下应该有效:

Partial Public Class Page
    Inherits UserControl

    Private TextBox1 as TextBox

    Public Sub New()
        InitializeComponent()
        TextBox1 = New TextBox() With {.Width = 300, .Height = 100}
        LayoutRoot.Children.Add(textbox)
    End Sub

    Private Sub OnTextChanged(sender as Object, e as TextChangedEventArgs) Handles TextBox1.TextChanged
        If e.Key = Key.Back Then
            e.Handled = True
        ElseIf e.Key = Key.Delete Then
            e.Handled = True
        End If
    End Sub
End Class

(我的VB有点生疏,所以事件处理程序的语法可能不完全正确。)

基本想法是在您的UserControl 中的TextBox 中的文本发生更改时收到通知。这样您就可以根据需要修改UserControl 的其他部分。

【讨论】:

  • 你愿意举个例子吗? .
  • 安迪.. 很抱歉我还没有回到这个.. 我已经看过(不是很长或很辛苦),但我还没有完全到那里。 OnTextChanged 给出了一个错误,我需要一个 withevents 变量。我在想 tat 通常在 zaml.. 希望你有兴趣继续我的教育。谢谢
  • 正如我所说,我不经常使用 VB,所以我可能没有正确的语法。我认为您需要在声明 TextBox1 的行尾添加 WithEvents,但我对此并不肯定。
  • 嘿..我再次环顾四周..你提到使用 textchanged 事件。该事件不允许 e.key 或 e.handled。当您单击返回键时,textChanged 也不会启动。所以我认为 textchanged 不是要使用的事件.. 男孩.. 我希望我知道更多:)。我想我回到原来的问题。有没有办法让子类与用户控件对话,以便我可以了解子类中发生的事情。或者你有不同的想法。抱歉问了这么多。再次感谢
  • 除了 TextChanged 之外,您还可以在 TextBox 之外使用其他事件(您可以在 MSDN 上查看完整列表,来自我在回答中提供的链接)。只要事件是在 UserControl 本身内处理的,您就可以在 UserControl 中做任何您需要做的事情。
【解决方案2】:

你可能想错了。由于您在 Silverlight 中,因此您可以使用绑定表达式获取此信息。举个简单的例子,你说你想知道一个文本框中有多少个字符。您可以使用以下 xaml 实现此目的:

    <TextBox x:Name="txtInput" />
    <TextBlock Text="{Binding ElementName=txtInput, Path=Text.Length}" />

【讨论】:

  • 可能遗漏了一些东西.. 但是.. 我现在需要每个按键的文本框的长度,以便我可以在后面的代码中执行一些逻辑。你能帮我理解我如何用你上面的东西做到这一点..如果可能的话。或者您上面的内容是绑定的,在此示例中将在文本块中显示最新长度。谢谢
  • 如果您想在后面的代码中处理文本输入,请为 KeyUp 事件添加事件处理程序。在那里,您可以按名称或发件人引用文本框。例如txtInput.Text.Length。
  • 我在文本框上尝试了 keyup 事件.. 它适用于很多 keyups.. 但退格被忽略了......我需要抓住它。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-12-12
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多