2017-01-15 6 views
1

奇妙な状況強調表示の行ではありませんが、私は以下のXAMLを持っている:WPFのListBox、SelectedIndexをが

<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ボタンを押すと、今のようになります。私は何とかWPFが本当に望んでいる適切な順序のうちの選択を設定してい疑う

Wrong selection example #2

+0

それが唯一のコードであれば、すべてがうまくいくはずです。どのような 'SelectionMode'を使用していますか? SelectedIndexを設定する以外に何か他の選択をしていますか?選択したインデックス(ボタンクリックハンドラ)の変更はどこで呼び出されますか? – icebat

答えて

-2

あなたのアイテムのように見えますが、強調表示されていません。ピントが合ったときにシアンにハイライト表示することができます。

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

と灰色ではない。

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

ListBoxは、複数の選択肢を処理するように設計されており、ハイライトは別の状況です。また、このような

LoggingListBox.ScrollIntoView(LoggingListBox.Items[3]); 
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; 
}