xaml Scrollviewer - отключить чрезмерную прокрутку / эффект резиновой ленты / эффект моментального возврата / подпрыгивание всего окна

Когда я использую средство просмотра прокрутки в списке, все мое окно подпрыгивает, когда я достигаю конца списка с помощью сенсорной прокрутки. Это поведение не проявляется при использовании колесика мыши. Как я могу отключить этот эффект прокрутки / резиновой ленты / эффект возврата / эффект подпрыгивания.

Я работаю с .NET Framework 4.5 на компьютере с Windows 8.

Вы можете увидеть эффект отскока на этом видео: http://www.vidup.de/v/gQ2pI/

Вот мой пример кода:

<Window x:Class="style_test_for_scrollviewer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Grid>
        <ListBox Width="200">
            <WrapPanel Width="200"      ScrollViewer.PanningMode="VerticalOnly"         ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Visible">
                <Button Height="200" Width="200"></Button>
                <Button Height="200" Width="200"></Button>
                <Button Height="200" Width="200"></Button>
                <Button Height="200" Width="200"></Button>
                <Button Height="200" Width="200"></Button>
                <Button Height="200" Width="200"></Button>
                <Button Height="200" Width="200"></Button>
                <Button Height="200" Width="200"></Button>
                <Button Height="200" Width="200"></Button>
                <Button Height="200" Width="200"></Button>
                <Button Height="200" Width="200"></Button>
                <Button Height="200" Width="200"></Button>
        </WrapPanel>
        </ListBox>
    </Grid>
</Window>

person user2440589    schedule 31.05.2013    source источник


Ответы (1)


Вы можете удалить это поведение, переопределив метод OnManipulationBoundaryFeedback:

public class FixedListBox : ListBox
{
    protected override void OnManipulationBoundaryFeedback(ManipulationBoundaryFeedbackEventArgs e)
    {
        e.Handled = true;
    }
}

Другое решение — добавить следующий обработчик к событию ManipulationBoundaryFeedback (непосредственно в ListBox или через стиль):

<ListBox ManipulationBoundaryFeedback="OnManipulationBoundaryFeedback"/>

Or:

<Style TargetType="{x:Type ListBox}">
    <EventSetter Event="ManipulationBoundaryFeedback" Handler="OnManipulationBoundaryFeedback"/>
</Style>

Со следующим кодом позади:

protected void OnManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e)
{
    e.Handled = true;
}

Эти методы работают и с ScrollViewer.

person Max    schedule 24.06.2013