NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Karel Labonek:22.8.2017 15:54

Dobrý den,
mám problém s listBoxem v XAML kódu kde jsem ho na "Bindoval" na ObservableCollec­tion. Potud vše ok listBox mi zobrazí vše jak má tedy až na to že se neposouvá fokus. Nemám ponětí jak to řešit zřejmě jeto školácky jednoduché :-( . Napadlo mě že bych reagoval na nějaký event listBoxu no a tam něco jako:
ListBox.Selec­tedIndex = ListBox.Items.Count - 1;
ListBox.ScrollIn­toView(ListBox­.SelectedItem);
Ale nemám ponětí který použít. Děkuji za pomoc.

 
Odpovědět
22.8.2017 15:54
Avatar
Odpovídá na Karel Labonek
Michal Štěpánek:22.8.2017 16:21

Ukaž kousek kódu, jak jsi ho "nabindoval"...

Nahoru Odpovědět
22.8.2017 16:21
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Karel Labonek:22.8.2017 16:39

No kód mám už dost rozsáhlí, ale snad postačí tohle:
Mám třídu rozhodčí :

class Rozhodci : INotifyPropertyChanged
    {
public ObservableCollection<Tah> Tahy { get; set; }
Tahy.Add(novyTah);

V CodeBehin MainWindow v konstruktoru mám:

public MainWindow()
        {

            InitializeComponent();
            DataContext = rozhodci;

A v MainWindow XAML:

<ListBox Name="hietorieTahuListBox" ItemsSource="{Binding Tahy}"

jak jsem psal v listBoxu se mi to zobrazuje jen se mi neposouvá "scroll" no posuvník když už mám víc prvků než je prostoru pro zobrazení. Děkuji

 
Nahoru Odpovědět
22.8.2017 16:39
Avatar
Odpovídá na Karel Labonek
Michal Štěpánek:22.8.2017 16:49

Já mám v XAMLu

<ListBox Name="lbVedouci" Grid.Column="0" Grid.Row="0" Margin="5" ItemsSource="{Binding Manager}" />

v kódu okna mám

lbVedouci.DataContext = spravceMobVedouci;

a v třídě

public ObservableCollection<MobVedouci> Manager { get; set; }
public SpravceMobVedouci()
        {
            Manager = new ObservableCollection<MobVedouci>();
        }

a funguje to normálně...

Co znamená "neposouvá se focus"?

Editováno 22.8.2017 16:50
Nahoru Odpovědět
22.8.2017 16:49
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Karel Labonek:22.8.2017 17:04

No že ten listBox má nějakou pevnou velikost, a když provádím jednotlivé tahy tak se mi každý zapíše na jeden řádek tak jak chci, no ale za chvíli je těch řádků samozřejmě víc než se vejde do kontrolky listBox. Samozřejmě se mi v tu chvíli zobrazí posuvník na pravé straně litBoxu, řádky se dále zapisují ale nejsou vidět musím ručně posunout posuvník. Je mi jasné že je to tím že nemám nastavený selectIndex a slectItem, ale nevím jak to zařídit když jen "binduji". Děkuji za trpělivost jsem úplnej začátečník :-) .

 
Nahoru Odpovědět
22.8.2017 17:04
Avatar
Ondřej Štorc
Tvůrce
Avatar
Nahoru Odpovědět
22.8.2017 17:56
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Karel Labonek:23.8.2017 6:07

Zdravím, omlouvám se že to tak trvalo, ale mám problém s AJ :-( (takže překladač Google) no jak asi tušíte nic moc pořád se motám do kola. Našel jsem na tvém odkazu jakýsi kód třídy

public class ListBoxExtenders : DependencyObject
        {
            #region Properties

            public static readonly DependencyProperty AutoScrollToCurrentItemProperty = DependencyProperty.RegisterAttached("AutoScrollToCurrentItem", typeof(bool), typeof(ListBoxExtenders), new UIPropertyMetadata(default(bool), OnAutoScrollToCurrentItemChanged));

            /// <summary>
            /// Returns the value of the AutoScrollToCurrentItemProperty
            /// </summary>
            /// <param name="obj">The dependency-object whichs value should be returned</param>
            /// <returns>The value of the given property</returns>
            public static bool GetAutoScrollToCurrentItem(DependencyObject obj)
            {
                return (bool)obj.GetValue(AutoScrollToCurrentItemProperty);
            }

            /// <summary>
            /// Sets the value of the AutoScrollToCurrentItemProperty
            /// </summary>
            /// <param name="obj">The dependency-object whichs value should be set</param>
            /// <param name="value">The value which should be assigned to the AutoScrollToCurrentItemProperty</param>
            public static void SetAutoScrollToCurrentItem(DependencyObject obj, bool value)
            {
                obj.SetValue(AutoScrollToCurrentItemProperty, value);
            }

            #endregion

            #region Events

            /// <summary>
            /// This method will be called when the AutoScrollToCurrentItem
            /// property was changed
            /// </summary>
            /// <param name="s">The sender (the ListBox)</param>
            /// <param name="e">Some additional information</param>
            public static void OnAutoScrollToCurrentItemChanged(DependencyObject s, DependencyPropertyChangedEventArgs e)
            {
                var listBox = s as ListBox;
                if (listBox != null)
                {
                    var listBoxItems = listBox.Items;
                    if (listBoxItems != null)
                    {
                        var newValue = (bool)e.NewValue;

                        var autoScrollToCurrentItemWorker = new EventHandler((s1, e2) => OnAutoScrollToCurrentItem(listBox, listBox.Items.CurrentPosition));

                        if (newValue)
                            listBoxItems.CurrentChanged += autoScrollToCurrentItemWorker;
                        else
                            listBoxItems.CurrentChanged -= autoScrollToCurrentItemWorker;
                    }
                }
            }

            /// <summary>
            /// This method will be called when the ListBox should
            /// be scrolled to the given index
            /// </summary>
            /// <param name="listBox">The ListBox which should be scrolled</param>
            /// <param name="index">The index of the item to which it should be scrolled</param>
            public static void OnAutoScrollToCurrentItem(ListBox listBox, int index)
            {
                if (listBox != null && listBox.Items != null && listBox.Items.Count > index && index >= 0)
                    listBox.ScrollIntoView(listBox.Items[index]);
            }

            #endregion
        }

ten jsem vložil do codebehin do definice class MainWindow : Window
dále jsem se v Xaml MainWindow pokusil o dvě věci:

  1. jsem se pokusil rosšířit namespace
<Window x:Name="hlavniOkno" x:Class="Evade._001.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"
        xmlns:local="clr-namespace:Evade._001"
        xmlns:Extenders="clr-namespace:Evade._001"
        mc:Ignorable="d"
  1. použít vše v ListBox
<ListBox Name="hietorieTahuListBox" ItemsSource="{Binding Tahy}" FontWeight="Normal"
                         ScrollViewer.CanContentScroll="True"
                         IsSynchronizedWithCurrentItem= "True"
                         Extenders:ListBoxExtenders.AutoScrollToCurrentItem="True"/>

při sestavení mi to píše:
1)

Závažnost     Kód    Popis   Projekt Soubor  Řádek
Chyba           Název ListBoxExtenders neexistuje v oboru názvů clr-namespace:Evade._001.    Evade.001       D:\Škola\EVADE\Evade.003\Evade.001\MainWindow.xaml     544

2)

Závažnost     Kód    Popis   Projekt Soubor  Řádek
Chyba           Vlastnost ListBoxExtenders.AutoScrollToCurrentItem v oboru názvů XML clr-namespace:Evade._001 neexistuje. Řádek 544 pozice 26.      Evade.001       D:\Škola\EVADE\Evade.003\Evade.001\MainWindow.xaml     544

3)

Závažnost     Kód    Popis   Projekt Soubor  Řádek
Chyba           Připojitelná vlastnost AutoScrollToCurrentItem se nenašla v typu ListBoxExtenders.   Evade.001       D:\Škola\EVADE\Evade.003\Evade.001\MainWindow.xaml     544

děkuji za trpělivost :-) .

 
Nahoru Odpovědět
23.8.2017 6:07
Avatar
Karel Labonek:23.8.2017 6:21

Jak na tom stále přemýšlím nebude nejjednodušší zapomenout na Binding ListBoxu a přidávat tam prvky nějakou metodou kde zadám i "selectionChange", pak budu moci reagovat na "selectionChange" v listBoxu metodou která má vsobě něco jako "ListBox.Scro­llIntoView(Lis­tBox.SelectedI­tem);" .... nebo vlastně dát obojí do té první metody kde jak přidám prvek do listBoxu tak nastavím "selectionChange" a "ScrollIntoView" ?
Děkuji.

 
Nahoru Odpovědět
23.8.2017 6:21
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.