【发布时间】:2013-01-23 05:36:26
【问题描述】:
见下面的代码
视觉工作室 2010
ListBox 上方有一个 TextBox。
通过绑定文本框可以在选择项目时变大或变小。
这会导致 ListBox 移动。
当 ListBox 移动时,选中的项目不是被点击的项目。
选中的项目是移动的 ListBox 上鼠标下的项目。
有时它甚至根本不会选择(尝试从 9 到 10 或从 10 到 9)。
在此代码中重现问题的偶数和奇数产生不同的长度。
因此,如果您从奇数变为奇数,甚至从偶数变为偶数,那么没问题。
如果您从顶部的奇数到底部的偶数(不滚动),则有时会选择一个不在视图中的项目。
在实际代码中,TextBox 是对项目的描述,描述的长度不同。
有趣的是在调试中,在 get { return boundText; 上有一个断点; } 然后它会选择正确的项目。
我认为它会处理选择,然后测量 UI,然后在新 UI 上再次处理选择。
由于它在调试中的行为不同,因此很难弄清楚。
<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 现在显示“耶!鼠标已按下,我被选中了!”当有断点时它起作用的唯一原因是它让您有机会在循环继续之前让鼠标按钮向上。不幸的是,我不知道如何解决它 - 我尝试捕获鼠标事件并设置一个标志以强制停止进一步的选择,直到鼠标上升,但我无法让它工作。祝你好运!