WPF ListBox,SelectedIndex不是突出显示的行

时间:2017-01-15 18:45:44

标签: c# wpf listbox

奇怪的是,我得到了以下XAML:

<StackPanel>
  <TextBlock>Logging here...</TextBlock>
  <ListBox x:Name="LoggingListBox" ItemsSource="{Binding Log}" />
</StackPanel>

我的来源只是ObservableCollection<string>中的5行文字,我选择了第4行:

LoggingListBox.SelectedIndex = 3;

但它显示如下:

Weird...

如您所见,第3项确实有边框,但为什么第一行会突出显示?

任何人都知道发生了什么?

更新1/17/17: 我已经制作了一个较小的问题演示版本。

1)新的WPF项目

2)MainWindow.xaml:

<Window x:Class="ListBoxSelectionTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow">
    <StackPanel>
        <TextBlock>Logging here...</TextBlock>
        <ListBox x:Name="LoggingListBox" ItemsSource="{Binding Log}" />
    </StackPanel>
</Window>

3)代码背后:

public partial class MainWindow 
{
    public ObservableCollection<string> Log { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        Log = new ObservableCollection<string>();
        Log.CollectionChanged += (o, e) => LoggingListBox.SelectedItem = Log.Last();

        Log.Add("Adding instrument: Unknown:#22");
        Log.Add("Adding instrument: Unknown:#22");
        Log.Add("Adding instrument: Unknown:#22");
        Log.Add("Adding instrument: Unknown:#22");
        Log.Add("Adding instrument: Unknown:#22");
    }
}

4:运行程序: 在启动时看起来像这样:

Wrong selection example #1

5:点击TAB按钮(将焦点设置为列表框),现在看起来像:

Wrong selection example #2

我怀疑我以某种方式将选择设置为WPF真正想要的正确顺序。

3 个答案:

答案 0 :(得分:0)

编辑完之后,您的情况会更清楚。

首先,请注意,对您的示例进行此小测试更改可以解决问题:

Log.Add("Adding instrument: Unknown:#22");
Log.Add("Adding instrument: Unknown:#23");
Log.Add("Adding instrument: Unknown:#24");
Log.Add("Adding instrument: Unknown:#25");
Log.Add("Adding instrument: Unknown:#26");

现在每个字符串都不同。所以第一行是灰色\蓝色的原因是因为ListBox基本上不能解散它们。

但为什么我们点缀边界呢?嗯,那是因为它是由另一种机制 - FocusVisualStyle绘制的。它似乎正确地跟踪选定的视觉元素。

对于这种情况,有不同的可能解决方案,但为什么不将选择逻辑移动到索引并完成呢?

LoggingListBox.Loaded += (o, e) =>
    {
        Log.CollectionChanged += (oo, ee) => SelectLastEntry();
        SelectLastEntry();
    };

...

private void SelectLastEntry()
{
     LoggingListBox.SelectedIndex = LoggingListBox.Items.Count - 1;
}

答案 1 :(得分:-2)

看起来您的项目已选中但未突出显示。您可以尝试在聚焦时突出显示为青色。

<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Cyan"/>

并且在未聚焦时为灰色。

<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Gray" />

答案 2 :(得分:-2)

ListBox旨在处理多个选择,而突出显示则是一个单独的情况。您还需要将其滚动到视图中以将突出显示更改为所选的

LoggingListBox.ScrollIntoView(LoggingListBox.Items[3]);