查看下面的代碼
Visual Studio 2010
列表框上方有一個文本框。
選中某個項目時,通過綁定TextBox可以變大或變小。
這會導致ListBox移動。
當ListBox移動選定的項目不是被點擊的項目。
所選項目是移動列表框上的鼠標下的項目。
有時它甚至不會選擇(嘗試從9到10或從10到9)。
在此代碼中重現問題的奇偶產生不同的長度。
所以,如果你從奇數到奇數甚至到沒有問題。
如果你從奇數頂部到底部(沒有滾動),那麼有時會選擇一個甚至不在視圖中的項目。
在實際代碼中,文本框是對項目的描述,描述的長度也不相同。
有趣的是在調試和get {return boundText; }然後它會選擇適當的項目。
我認爲它處理選擇,然後衡量用戶界面,然後在新的用戶界面上再次處理選擇。
由於它在調試中表現不同,所以很難弄清楚。列表框未選擇所選項目
<Window x:Class="ListBoxMissClick.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Row="0" Grid.Column="0" Text="{Binding Path=BoundText}" TextWrapping="Wrap" />
<ListBox Grid.Row="1" Grid.Column="0" ItemsSource="{Binding Path=BoundList}" SelectedItem="{Binding Path=BoundListSelected, Mode=TwoWay}"/>
</Grid>
</Window>
using System.ComponentModel;
namespace ListBoxMissClick
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
private string boundListSelected;
private string boundText = string.Empty;
private List<string> boundList = new List<string>();
private bool shortLong = true;
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public MainWindow()
{
for (int i = 0; i < 1000; i++)
{
boundList.Add(i.ToString());
}
InitializeComponent();
}
public string BoundText
{
get { return boundText; }
set
{
if (boundText != value)
{
boundText = value;
NotifyPropertyChanged("BoundText");
}
}
}
public List<string> BoundList { get { return boundList; } }
public string BoundListSelected
{
get { return boundListSelected; }
set
{
boundListSelected = value;
if (Int32.Parse(value) % 2 == 0)
{
BoundText = value.ToString() + " something very long something very long something very long something very long something very long something very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very long";
}
else
{
BoundText = value.ToString() + " something short ";
}
}
}
private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
BoundText = " something very long something very long something very long something very long something very long something very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very long";
}
}
}
除了接受的答案Mouse.Capture和ReleaseMouseCapture的工作。
set
{
Mouse.Capture(this);
{
boundListSelected = value;
if (Int32.Parse(value) % 2 == 0)
{
BoundText = value.ToString() + " something very long something very long something very long something very long something very long something very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very long";
}
else
{
BoundText = value.ToString() + " something short ";
}
}
ReleaseMouseCapture();
}
呵呵,是的,如果你只是把鼠標放下,它真的很有趣。所以,佈局被更新,鼠標下面的ListBoxItem現在說:「耶!鼠標關閉了,我被選中了!」它有一個突破點時它的唯一原因是它讓你有機會在循環繼續之前獲得鼠標按鈕。不幸的是,我不知道如何解決它 - 我試圖捕獲鼠標事件,並設置一個標誌來強制進一步選擇,直到鼠標上升,但我無法讓它工作。祝你好運! – Jelly