Текстовое поле автозаполнения зависает при выполнении запроса. Должен быть способ получше!

все! Я искал все, что мог, и не нашел именно той помощи, которую искал.

Проблема

AutoCompleteTextbox ЗАМЕРЗАЕТ и «съедает» символы во время выполнения запроса

Запрашивает

Подражает функциям Google Instant

Справочная информация

Перво-наперво: C #, WPF, .NET 4.0

Хорошо, теперь это не мешает, я ' m пытается найти лучший способ реализовать динамическое текстовое поле AutoComplete, которое запрашивает результаты в базе данных после каждой набранной буквы.

Следующий код запускается, когда вызывается событие TextChanged AutoCompleteTextBox:

    public void Execute(object sender, object parameter)
    {
        //removed some unnecessary code for the sake of being concise

        var autoCompleteBox = sender as AutoCompleteTextBox;
        var e = parameter as SearchTextEventArgs;

        var result = SearchUnderlyings(e.SearchText);

        autoCompleteBox.ItemsSource = result;
    }

Теперь предположим, что SearchUnderlyings (e.SearchText) занимает в среднем 600–1100 мс - в течение этого времени текстовое поле замораживается и "съедает" любые нажатые клавиши. У меня возникла досадная проблема. По какой-то причине LINQ в SearchUnderlyings (e.SearchText) работает в потоке графического интерфейса пользователя. Я пробовал делегировать это фоновому потоку, но результат тот же.

В идеале, я бы хотел, чтобы текстовое поле работало так же, как Google Instant, но я не хочу "убивать" потоки до того, как сервер / запрос сможет вернуть результат. но теперь моя проблема в том, что подпредставления UIScrollView не получают никаких событий касания - только основной UIScrollView.

В следующем примере, если включен код hitTest , то прокрутка прокручивается правильно, листает один столбец за раз, и все его содержимое может быть видно, но внутренние прокрутки не получают событий касания. .

Если я удалю код hitTest , то прикосновения получит только первый дочерний элемент scrollview, и все его содержимое будет видно - но основной вид прокрутки не будет касаться области без обрезки.

Как я могу решить эту проблему?

Пример:

//=========================================
// UIScrollViewEx
// Just in order to log touches...
//=========================================

@interface UIScrollViewEx : UIScrollView {} 
@end

@implementation UIScrollViewEx
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touches Began (0x%08X)", (unsigned int)self);
}
@end

//=========================================
// UIViewEx
// Dummy class - sets subview as hit target
// just to demonstrate usage of non-clipped 
// content
//=========================================

@interface UIViewEx : UIView {} 
@end

@implementation UIViewEx
- (UIView *) hitTest:(CGPoint) point withEvent:(UIEvent *)event {
    if ([self pointInside:point withEvent:event]) {
        return [self.subviews objectAtIndex:0];
    }
    return nil;
}
@end

//=========================================
// MainClass
// Any UIViewEx based class which returns
// the UIScrollView child on hittest
//=========================================

@implementation MyClass

- (UIColor*) randomColor
{
    int r = arc4random() % 100;
    int g = arc4random() % 100;
    int b = arc4random() % 100;
    return [UIColor colorWithRed:(0.01 * r) green:(0.01 * g) blue:(0.01 * b) alpha:1.0];
}

- (void) loadScrollviews
{
    // Set frame to half of actual width so that paging will swipe half a page only
    CGRect frame = CGRectMake(0, 0, self.bounds.size.width / 2, 400);

    // Main scrollview
    UIScrollView *scrollview = [[UIScrollView alloc] initWithFrame:frame];
    [scrollview setBackgroundColor:[UIColor greenColor]];
    [scrollview setPagingEnabled:YES];
    [scrollview setClipsToBounds:NO];

    // Create smaller scrollviews inside it - each one half a screen wide
    const int numItems = 5;
    for(int i = 0; i < numItems; ++i) {
        frame.origin.x = frame.size.width * i;
        UIScrollView *innerScrollview = [[UIScrollViewEx alloc] initWithFrame:frame];
        [innerScrollview setContentSize:CGSizeMake(frame.size.width, 1000)];
        [innerScrollview setBackgroundColor:[self randomColor]];
        [scrollview addSubview:innerScrollview];
        [innerScrollview release];
    }

    [scrollview setContentSize:CGSizeMake(numItems * frame.size.width, frame.size.height)];

    [self addSubview:scrollview];
}

@end

Обновление
Я перенаправляю штрихи во внутреннее представление, выполняя следующие действия, но наверняка должен быть лучший способ?

- (UIView *) hitTest: (CGPoint) pt withEvent: (UIEvent *) event 
{    
    if(CGRectContainsPoint(self.bounds, pt)) 
    {
        UIScrollView *scrollview = [self.subviews objectAtIndex:0];
        CGPoint scrollViewpoint = [scrollview convertPoint:pt fromView:self];

        for(UIView *view in scrollview.subviews) {
            if(CGRectContainsPoint(view.frame, scrollViewpoint)) {
                return view;
            }
        }
        return scrollview;
    } 
    else {
        return [super hitTest:pt withEvent:event];
    }
}
8
задан LK. 14 December 2010 в 13:05
поделиться