MS Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
50 % bodů zdarma na online výuku díky naší Slevové akci!

Diskuze: Skrollovanie v listboxe

Aktivity (5)
Avatar
Štefan Kiss
Člen
Avatar
Štefan Kiss:21.12.2019 16:08

Dobrý deň, zistil som jednu nemilú vec, ak vo WPF použijem listbox a naplním ho dátami, tak šípkami hore a dolu môžem prechádzať jednotlivé položky avšak iba tie, ktoré sú práve zobrazené. Z 200 položiek tak napr prejdem prvých 10 a znova sa vrátim na začiatok. Je možné nastaviť listbox tak, aby sa automaticky skrolloval a po stláčaní hornej či dolnej šípky som mohol prejsť celý obsah?

Zkusil jsem: Skúšal som ScrollViewer.Can­ContentScroll resp ďalšie vlastnosti Scrollvieweru bez efektu.

Chci docílit: Keďže po listboxe chodím šípkami potrebujem byť shopný prejsť šípkou hore a dolu celý listbox nie iba prvých 10 položiek.

 
Odpovědět
21.12.2019 16:08
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Štefan Kiss
Tadeáš Burda :22.12.2019 12:25
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    <Grid>
        <ScrollViewer>
            <ListBox Name="listBox"/>
        </ScrollViewer>
    </Grid>
</Window>

Vlož ten ListBox do ScrollViewru

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
22.12.2019 12:25
Avatar
Tadeáš Burda
Brigádník
Avatar
Tadeáš Burda :22.12.2019 12:27

Potom iba označiš item v ListBoxe myšou a scrolluješ až dokonca. Mne to ide, ak to je teda to čo chceš, inak som ta asi nepochopil.

 
Nahoru Odpovědět
22.12.2019 12:27
Avatar
Štefan Kiss
Člen
Avatar
Štefan Kiss:22.12.2019 15:17

Oh funguje skvelo vďaka, to mi vôbec nenapadlo. Hral som sa len so scrollviewerom v listboxe tedy <ListBox ScrollViewer.xxx >. Ešte raz vďaka.

 
Nahoru Odpovědět
22.12.2019 15:17
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Štefan Kiss
Člen
Avatar
Štefan Kiss:9. ledna 22:53

Ešte raz sa vrátim k tejto téme. Listbox vložený do ScrollViewru funguje ako má avšak všimol som si, že ak dosiahnem koniec zoznamu, tak stlačenie šípky dolu ma niekedy vráti znovu na začiatok. Nie vždy je to vhodné. Je prosím možné toto vypnúť nejakou vlastnosťou toho scrolviewru alebo musím robiť ručne odchytenie dolnej šípky? Pripadá mi to ako ísť s delom na vrabce no neviem nič jednoduchšie nájsť. Mám dojem, že sa to deje hlavne vtedy, ak je v listboxe málo položiek, teda menej ako sa zmestí na jednu obrazovku. Ak je položiek viac a obsah prescrolluje cez viac obrazoviek, tak po dosiahnutí konca ostane focus na konci tak ako má. Chcel by som takéto správanie dosiahnuť u každého počtu položiek.

 
Nahoru Odpovědět
9. ledna 22:53
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Štefan Kiss
Tadeáš Burda :10. ledna 16:10

Ukáž kód, alebo aspoň ten kus kódu, pretože mne osobne to nerobí. Skúšal sem to

 
Nahoru Odpovědět
10. ledna 16:10
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Štefan Kiss
Tadeáš Burda :10. ledna 16:14

Nemyslím si, že odchytávanie šipiek je dobrá cesta. Jj, je to kanón :D Ale ak je nato niaka udalosť tak onej neviem. Skús pozrieť oficiálnu dokumentáciu

 
Nahoru Odpovědět
10. ledna 16:14
Avatar
Štefan Kiss
Člen
Avatar
Štefan Kiss:13. ledna 12:37

Ahoj no kod je v podstate jednoduchy. Xaml vyzera asi takto

<Window Name="OknoPoznamky" x:Class="Orga­niser.Poznamky­.PoznamkyWindow"
xmlns="http:/­/schemas.micro­soft.com/winfx/2006/xam­l/presentation"
xmlns:x="http­://schemas.mi­crosoft.com/win­fx/2006/xaml"
xmlns:d="http­://schemas.mi­crosoft.com/ex­pression/blen­d/2008"
xmlns:mc="htt­p://schemas.o­penxmlformats­.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Orga­niser"
mc:Ignorable="d"
Title="{Binding Titulok}" Height="450" Width="800" WindowStartup­Location="Cen­terScreen"
>

<Window.Comman­dBindings>
<CommandBinding Command="local:Pri­kazy.VybratVset­ko" CanExecute="Vy­bratVsetkoCom­mand_CanExecu­te" Executed="Vybrat­VsetkoCommand_E­xecuted" />
XXX
</Window.Comman­dBindings>

<Grid >
<Grid.RowDefi­nitions>
<RowDefinition Height="50" />
<RowDefinition Height="*" />
<RowDefinition Height="50" />
</Grid.RowDefi­nitions>

<Menu Name="hlavneMenu" Grid.Row="0" Grid.Column="0" Margin="15" HorizontalAlig­nment="Center" VerticalAlignmen­t="Center" IsMainMenu="True" FontSize="14" KeyboardNaviga­tion.TabNaviga­tion="None" IsTabStop="True" >

<MenuItem Name="menuZaznam" Header="Záznam" >
<MenuItem Command="local:Pri­kazy.VybratVset­ko" />
XXX
</MenuItem>
</Menu>

<ScrollViewer Grid.Row="1" Margin="15" HorizontalAlig­nment="Center" VerticalAlignmen­t="Center" >
<ListBox Name="zoznamLis­tBox" Grid.Row="1" Grid.Column="0" Margin="15" HorizontalAlig­nment="Center" VerticalAlignmen­t="Center"
IsSynchronized­WithCurrentItem="Tru­e" SelectionMode="Ex­tended" ItemsSource="{Bin­ding List}" >
<ListBox.Input­Bindings>
<KeyBinding Command="local:Pri­kazy.VybratVset­ko" Modifiers="Ctrl" Key="A" />
XXX
</ListBox.Input­Bindings>
</ListBox>
</ScrollViewer>

<StatusBar Grid.Row="2" Grid.Column="0" VerticalAlignmen­t="Bottom" HorizontalAlig­nment="Left" Margin="15" >
<TextBlock Text="{Binding Stav}" HorizontalAlig­nment="Center" VerticalAlignmen­t="Center" />
</StatusBar>

</Grid>
</Window>

V code behind mam osetrenu iba nasledovnu udalost aby sa mi po nacitani novych dat focusla prva polozka:
void OnGeneratorSta­tusChanged(ob­ject sender, EventArgs e)
{
if (zoznamListBox­.ItemContainer­Generator.Sta­tus == GeneratorStatus­.ContainersGe­nerated)
{
zoznamListBox­.SelectedIndex = 0;
zoznamListBox­.SelectedItem = 0;
zoznamListBox­.ScrollIntoVi­ew(zoznamListBox­.SelectedItem);
var pl = (ListBoxItem)zoz­namListBox.Item­ContainerGene­rator.Container­FromItem(zoznam­ListBox.Selec­tedItem);
if (pl != null)
pl.Focus();
}
}

Oknu teda dominuje listbox kde su zobrazene moje zaznamy, nacitane z bindovaneho Listu. Funkcne vsetko pracuje ako ma ale mierne ma irituje, ze ak je listbox focusnuty, co vlastne po celu dobu je, tak klavesove skratky nefunguju tak, ako by bezne mali.

  1. Najprv som riesil problem, ze klavesa home a end neskocili na zaciatok a koniec celeho listu ako sa to deje kdekolvek vo Windows v zoznamoch. Toto som s Tvojou pomocou vyriesil vlozenim listboxu do Scrollviewru.
  2. Z mne neznamych dovodov stlacenie home a end spolu so shiftom nevyberie vsetky polozky, ako by malo. Hoci mam nastavene selectionmode na extended, ak stlacim shift+home, kurzor skoci na zaciatok a vyberie len prvu polozku. Rovnako shift+end skoci na koniec a vyberie poslednu. Pritom shift + 10x sipka dolu vyberie korektne 10 poloziek.

Toto momentalne riesim vlastnym prikazom

public static readonly RoutedUICommand VyberPolozkyOd­Zaciatku = new RoutedUIComman­d("VyberPoloz­kyOdZaciatku", "VyberPolozky­OdZaciatku", typeof(Prikazy), new InputGestureCo­llection() { new KeyGesture(Ke­y.Home,Modifi­erKeys.Shift) });

potom v code behind okna

void VyberPolozkyOd­ZaciatkuComman­d_Executed(ob­ject sender, ExecutedRoute­dEventArgs e)
{
int vybrataPolozka = zoznamListBox­.SelectedIndex;
for (int i=0; i<=vybrataPoloz­ka;i++)
{
zoznamListBox­.SelectedItem­s.Add(zoznamLis­tBox.Items[i]);
}
}

a napokon v xaml

<ListBox.Input­Bindings>
<KeyBinding Command="local:Pri­kazy.VybratVset­ko" Modifiers="Ctrl" Key="A" />
<KeyBinding Key="Home" Modifiers="Shift" Command="local:Pri­kazy.VyberPoloz­kyOdZaciatku" />
</ListBox.Input­Bindings>

3. Asi co ma najviac irituje, ze klavesove skratky prikazov listbox ignoruje. Mam vyrobene CustomCommands ako napriklad VybratVsetko. Tento je uvedeny vo Window.Comman­dBindings a priradeny polozke menu. pripadne by som ho mohol priradit polozke kontextoveho menu alebo inde co je ak dobre chapem prave zmysel Commands - mat jeden prikaz, ktory je volany z viacerych miest. Ak je ale focus na listboxe tak klavesova skratka nefunguje. Listbox ma svoju vlastnu, vykona to co ma sam definovane - teda vyberie vsetky polozky - ale nevykona sa to, co mam ja napisane v implementacii svojho prikazu. Teda evidentne listbox niektore klavesove skratky ignoruje a musim ich zvlast doplnat do casti ListBox.Input­Bindings co je v pohode, ak je program zalozeny na jednom ListBoxe, no ak by som mal napr. obrazovku s viacerymi Listboxmi je docela otrava kazdemu objektu zvlast vypisovat skratky, ak mam definovany command. Ten by proste mal mat prednost, ale nema.
No a toto riesim jedine pridanim comamnds do listbox.input­Bindings hoci jednoduchšie by sa mi zdalo buď proste klavesove skratky listboxu vypnut aby mali prioritu tie z prikazov, alebo jednoducho osetrovat udalosti keydown, lenze to nepomoze, lebo listbox najprv vykona svoje definovane ukony a v pripade kolizie osetrenie z keydown ignoruje..

 
Nahoru Odpovědět
13. ledna 12:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.