ListBox / ListView - Focus na danym wierszu

0

Witam,
mam problem mianowicie na oknie mam kontrolkę ListBox lub ListView.
Po załadowaniu okna Window_Loaded ustawiam focus na ListBoxie i ustawiam SelectedIndex = 0.

I tutaj pojawia się problem:
Mianowicie focus jest ustawiony na ramce od ListBox i dopiero PODWÓJNE naciśnięcie strzałki w dół przenosi mi focus na drugą pozycję z ListBox-a.

Działa to tak, że pierwsza strzałka w dół ściąga focusa z ramki ListBox i ustawia go na pierwszej pozycji na liście i dopiero druga strzałka w dół przenosi na drugi index.

Chciałbym aby już pierwsze wciśnięcie strzałki w dół ustawiało mi się na drugim indeksie.

0

tego zipa to chyba nikt nie odważy się pobierać... raczej pokaż kod a my se to same umiemy se poradzić tylko dobrze opisz o co Ci chodzi w którem miejscu... piszem przekornie jeśli rzeczywiście nie robisz se jajec... bo ten zip mi się totalnie nie podoba i cholera wie co tam możesz chcieć przemycić

0

Nie miałem zamiaru nikomu zrobić krzywdy tym ZIP-em, ale faktycznie -> nie wiesz co to jest lepiej nie ściągaj !!!

public MainWindow()
{
InitializeComponent();
}

    private void list1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            if (list1.SelectedIndex == 0)
            {
                list2.Items.Add("a");
                list2.Items.Add("b");
            }
            else if (list1.SelectedIndex == 1)
            {
                list2.Items.Add("b");
                list2.Items.Add("c");
            }
            else if (list1.SelectedIndex == 2)
            {
                list2.Items.Add("a");
                list2.Items.Add("c");
            }

            list1.IsEnabled = false;
            
          list2.SelectedIndex = 0;
            list2.Focus();
        }
    }

    private void list2_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            MessageBox.Show("List1 - "+list1.SelectedItem.ToString()+"\nList2 - "+list2.SelectedItem.ToString());

            list1.IsEnabled = true;
            list2.Items.Clear();

            list1.Focus();
            list1.SelectedIndex = 0;
        }
    }

    private void Window_Initialized(object sender, EventArgs e)
    {
        list1.Items.Add("1");
        list1.Items.Add("2");
        list1.Items.Add("3");
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        list1.Focus();
        list1.SelectedIndex = 0;
    }
}

Problem polega na tym, że muszę dwa razy nadusić strzałkę w dół, aby na liście focus ustawił się na drugim wierszu....

0

Ustaw sobie zmienną i zliczaj ile razy wcisnąłeś strzałkę w dół, jeżeli 1 to ustaw ją na drugim wierszu w listBoxie, nie wiem czy Cię dobrze zrozumiałem.

0

Próbowałem to zrobić.
Niestety nie rozwiązało to problemu.

Próbowałem również po pierwszym Enterze:

 list2.SelectedIndex = 0;
            list2.Focus();

Wywołać list2_KeyDown z przekazaniem strzałki na dół

Również nie pomogło....

0

dla ListBox ani dla ListView parametr KeyEventArgs nie posiada czegoś takiego u mnie w VS-2013-4 jak e.Key a jedynie KeyCode, keyData oraz KeyValue tak więc ten kod może być z sufitu...

0

Tutaj kod z Xaml:

<Window xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
x:Class="ListBoxFocus.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ListBox" Height="150" Width="250" Initialized="Window_Initialized" Loaded="Window_Loaded">
<Grid>
<dxlc:LayoutGroup Orientation="Vertical">
<dxlc:LayoutGroup Orientation="Horizontal" >
<Label Content="ListBox 1" Height="24" FontWeight="Bold" FontSize="16" Padding="0" HorizontalAlignment="Center" />
<Label Content="ListBox 2" Visibility="Visible" Height="24" FontWeight="Bold" FontSize="16" Padding="0" HorizontalAlignment="Center" />
</dxlc:LayoutGroup>
<dxlc:LayoutGroup Orientation="Horizontal" >

        <ListView x:Name="list1" FontSize="15" FontWeight="Bold" KeyDown="list1_KeyDown"/>
    
        
        <ListView x:Name="list2" FontSize="15"  Visibility="Visible" FontWeight="Bold" KeyDown="list2_KeyDown"/>
    </dxlc:LayoutGroup>
    </dxlc:LayoutGroup>
</Grid>
</window>

VSProfessional2013 Ver12.0.30501.00 Update2

0

A spróbuj ActiveControl = listBox1;

0

Rozwiązanie problemu:

listFrom.ItemContainerGenerator.StatusChanged += ItemContainerForlistFromGeneratorOnStatusChanged;

private void ItemContainerForlistFromGeneratorOnStatusChanged(object sender, EventArgs eventArgs)
{
if (listFrom.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
{
var index = listFrom.SelectedIndex;
if (index >= 0)
{
var item = listFrom.ItemContainerGenerator.ContainerFromIndex(index) as ListBoxItem;
if (item != null) item.Focus();
}
}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1