奇怪的是,我得到了以下XAML:
<StackPanel>
<TextBlock>Logging here...</TextBlock>
<ListBox x:Name="LoggingListBox" ItemsSource="{Binding Log}" />
</StackPanel>
我的来源只是ObservableCollection<string>
中的5行文字,我选择了第4行:
LoggingListBox.SelectedIndex = 3;
但它显示如下:
如您所见,第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:运行程序: 在启动时看起来像这样:
5:点击TAB按钮(将焦点设置为列表框),现在看起来像:
我怀疑我以某种方式将选择设置为WPF真正想要的正确顺序。
答案 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]);