9 Stimmen

WPF: ListBox deaktivieren, aber Scrollen aktivieren

Ich habe mir den ganzen Morgen den Kopf darüber zerbrochen.

Im Grunde habe ich eine Listbox, und ich möchte verhindern, dass die Benutzer die Auswahl während eines langen laufenden Prozesses ändern, aber es ihnen ermöglichen, immer noch zu blättern.

Lösung:

Alle Antworten waren gut, ich ging mit schlucken Maus-Ereignisse, da das die meisten straight forward war. Ich verdrahtet PreviewMouseDown und PreviewMouseUp auf ein einzelnes Ereignis, das meine backgroundWorker.IsBusy überprüft, und wenn es die IsHandled-Eigenschaft auf die Ereignis-Args auf wahr gesetzt wurde.

8voto

Jobi Joy Punkte 47482

Wenn Sie sich die Steuervorlage der ListBox ansehen, finden Sie darin eine ScrollBar und einen ItemsPresenter. Deaktivieren Sie den ItemsPresenter und Sie werden dies einfach erhalten. Verwenden Sie den unten stehenden Stil auf der ListBox und Sie sind gut zu gehen.

    <Style x:Key="disabledListBoxWithScroll" TargetType="{x:Type ListBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBox}">
                    <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="1">
                        <ScrollViewer Padding="{TemplateBinding Padding}" Focusable="false">
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" IsEnabled="False" IsHitTestVisible="True"/>
                        </ScrollViewer>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Verwenden Sie in der ListBox den Style

<ListBox    Style="{DynamicResource disabledListBoxWithScroll}" ..... />

2voto

Oskar Punkte 11

Ich habe diese Lösung verwendet, sie ist wirklich einfach und funktioniert perfekt:

Für jeden SurfaceListBoxItem item Sie setzen die Listbox tun Sie dies:

item.IsHitTestVisible = false;

2voto

Konrad Punkte 1004

Ich habe festgestellt, dass das Einfügen einer deaktivierten ListBox in einen ScrollViewer mit aktiviertem automatischen Bildlauf den gewünschten Effekt erzielt.

1voto

Andy Punkte 29060

Dieser Blogbeitrag ist zwar für Silverlight gedacht, aber vielleicht hilft er Ihnen dabei, in die richtige Richtung zu gehen? Silverlight Keine Auswahl ListBox und ViewBox

1voto

Yes - that Jake. Punkte 16190

Der Trick ist, sie nicht wirklich zu deaktivieren. Durch die Deaktivierung werden alle Nachrichten aus dem Rollfeld gesperrt.

Während des langen Vorgangs grauen Sie den Text im Listenfeld mit seiner Eigenschaft .ForeColor aus und verschlucken alle Mausklicks. Dadurch wird die Deaktivierung des Steuerelements simuliert und ein ungehinderter Bildlauf ermöglicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X