Пропавшие без вести Silverlight 3 ScrollViewer. Обходное решение события ScrollChanged?

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

log.info ("a = %s, b = %s", a, b)

можно сделать что-то вроде этого для любого языка с variadic аргументами (C/C++, C#/Java, и т.д.).

<час>

Это действительно не предназначается для того, когда аргументы трудно получить, но для того, когда форматирование их к строкам является дорогим. Например, если Ваш код уже имеет список чисел в нем, Вы могли бы хотеть зарегистрировать тот список для отладки. Выполнение mylist.toString() не будет требовать времени ни к какому преимуществу, поскольку результат будет выброшен. Таким образом, Вы передаете mylist в качестве параметра регистрирующейся функции и позволяете ей обработать строковое форматирование. Тем путем форматирование будет только выполнено в случае необходимости.

<час>

, Так как вопрос OP конкретно упоминает Java, вот то, как вышеупомянутое может использоваться:

я должен настоять, что проблема не 'форматирует' связанный, но 'оценка аргумента', связанная (оценка, которая может быть очень дорогостоящей, чтобы сделать, прежде, чем назвать метод, который ничего не сделает)

, прием должен иметь объекты, которые не выполнят дорогие вычисления, пока абсолютно не необходимый. Это легко на языках как Smalltalk или Python, которые поддерживают лямбды и закрытия, но является все еще выполнимым в Java с небольшим количеством воображения.

Говорят, что у Вас есть функция get_everything(). Это получит каждый объект от Вашей базы данных в список. Вы не хотите называть это, если результат будет отброшен, очевидно. Таким образом вместо того, чтобы использовать вызов для той функции непосредственно, Вы определяете внутренний класс, названный LazyGetEverything:

public class MainClass {
    private class LazyGetEverything { 
        @Override
        public String toString() { 
            return getEverything().toString(); 
        }
    }

    private Object getEverything() {
        /* returns what you want to .toString() in the inner class */
    }

    public void logEverything() {
        log.info(new LazyGetEverything());
    }
}

В этом коде, вызов к getEverything() обертывается так, чтобы это не было на самом деле выполнено, пока это не будет необходимо. Регистрирующаяся функция выполнится toString() на ее параметрах, только если отладка включена. Тем путем Ваш код перенесет только издержки вызова функции вместо полного getEverything() вызов.

9
задан eriksmith200 19 November 2009 в 10:41
поделиться

2 ответа

Вы можете использовать привязку элементов, вот глупый пример: -

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="100" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="60" />
    </Grid.RowDefinitions>
    <ScrollViewer x:Name="ScrollSource">
        <StackPanel>
            <TextBlock>Hello</TextBlock>
            <TextBlock>World</TextBlock>
            <TextBlock>Yasso</TextBlock>
            <TextBlock>Kosmos</TextBlock>
        </StackPanel>
    </ScrollViewer>
    <TextBox Grid.Column="1" Text="{Binding VerticalOffset, ElementName=ScrollSource}" />

</Grid>

Когда прокручивается ScrollViewer , свойство Text TextBox получает новое значение.

6
ответ дан 4 December 2019 в 21:10
поделиться

На форумах silverlight есть более простое решение:

protected override Size ArrangeOverride(Size finalSize)
{    
    // Assumes you only have one scrollviewer (e.g. fullscreen ScrollViewer)
    var scrollbar = LayoutRoot.GetVisualDescendants()
        .OfType<ScrollBar>()
        .FirstOrDefault();

    if (scrollbar != null)
        scrollbar.Scroll += ScrollBarScroll;

    return base.ArrangeOverride(finalSize);
}

private void ScrollBarScroll(object sender, ScrollEventArgs e)
{

}
3
ответ дан 4 December 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: