Выбранный элемент динамически созданного списка становится синим при изменении выбора другого списка - PullRequest
0 голосов
/ 24 декабря 2009

У меня есть TabControl с двумя TabItem s и ListBox, которые являются общими для обеих вкладок. Это ListBox необходимо выровнять внутри конкретного содержимого вкладки. Поэтому я не помещаю это вне вкладок. У меня есть еще один ListBox на одной из вкладок. Когда я выбираю элемент во втором ListBox, первые ListBox s SelectedItem становятся синими, поэтому у меня сразу появляется 2 ListBox es в качестве сфокусированного элемента управления.

Есть ли обходной путь для этой ошибки WPF? Вот скриншот и код:

альтернативный текст http://img85.imageshack.us/img85/871/2focusedcontrols.png

using System.Windows;
using System.Windows.Controls;

namespace WpfApplication3
{
    partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        void TabControl_SelectionChanged(
            object sender, SelectionChangedEventArgs e)
        {
            var parent = listBox.Parent as Panel;
            parent.Children.Remove(listBox);
            var panel = tabControl.SelectedIndex == 0 ? panel1 : panel2;
            panel.Children.Add(listBox);
        }
    }
}

<Window x:Class="WpfApplication3.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
    <TabControl Name="tabControl"
                SelectionChanged="TabControl_SelectionChanged">
        <TabItem Header="tab1">
            <StackPanel Name="panel1">
                <ListBox>
                    <ListBoxItem>click me second</ListBoxItem>
                    <ListBoxItem>item</ListBoxItem>
                </ListBox>
                <ListBox Name="listBox">
                    <ListBoxItem>click me first</ListBoxItem>
                    <ListBoxItem>item</ListBoxItem>
                </ListBox>
            </StackPanel>
        </TabItem>
        <TabItem Header="tab2">
            <StackPanel Name="panel2"/>
        </TabItem>
    </TabControl>
</Window>

1 Ответ

1 голос
/ 24 декабря 2009

Привет, проблема в том, что ваша вкладка управляет выбранным событием, и оно срабатывает, когда вы щелкаете по общему списку, в результате чего появляется экземпляр списка, который имеет фокус на другой вкладке. На самом деле это не совсем ошибка. Он делает именно то, что вы сказали.

Измените свой код в обработчике событий на:

if (e.Source is TabControl)
{
   var parent = listBox.Parent as Panel;
   parent.Children.Remove(listBox);
   var panel = tabControl.SelectedIndex == 0 ? panel1 : panel2;
   panel.Children.Add(listBox);
}

Это остановит нежелательное сфокусированное поведение, которое вы видели.

...