MaxLength для автозаполнения в Silverlight - PullRequest
1 голос
/ 27 июня 2010

Я использую элемент управления AutoCompleteBox в своем проекте. Теперь мне нужно ограничить длину текста, который может ввести пользователь, например, максимальной длиной 50 символов. В этом случае TextBox имеет свойство MaxLength, а AutoCompleteBox - нет. Кроме того, AutoCompleteBox не предоставляет свойства TextBox.

Я попытался решить проблему следующим образом:

private void autoCompleteBox_TextChanged(object sender, RoutedEventArgs e)
{
        AutoCompleteBox autoCompleteBox = sender as AutoCompleteBox;
        if (autoCompleteBox.Text.Length > MaxCharLength)
        {
            autoCompleteBox.Text = autoCompleteBox.Text.Substring(0, MaxCharLength);
        }
}

Большим недостатком этого метода является то, что после установки свойства Text курсор текстового поля сбрасывается в начальную позицию, а когда пользователь продолжает набирать текст, символы в конце обрезаются, а курсор всегда идет в начало. , Нет методов, доступных для управления кареткой (например, метод Select в TextBox).

Есть идеи, как установить максимальную длину для AutoCompleteBox?

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Как насчет ....

    public class CustomAutoCompleteBox : AutoCompleteBox
{
    private int _maxlength;
    public int MaxLength 
    {
        get
        {
            return _maxlength;
        } 
        set
        {
            _maxlength = value;
            if (tb != null)
                tb.MaxLength = value;
        } 
    }

    TextBox tb;
    public override void OnApplyTemplate()
    {
        tb = this.GetTemplateChild("Text") as TextBox;
        base.OnApplyTemplate();
    }
}
1 голос
/ 01 июля 2010

Проблема может быть решена путем создания подклассов из класса Control, из которого происходит AutoCompleteBox, следующим образом:

public class AutoCompleteBoxMaxLengthed : AutoCompleteBox
{
    public int MaxLength
    {
        get;
        set;
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (Text.Length >= MaxLength)
        {
            e.Handled = true;
        }
        else
        {
            base.OnKeyDown(e);
        }
    }
}
...