列表框未选择所选项目

2024-03-22

请参阅下面的代码
视觉工作室2010
ListBox 上方有一个 TextBox。
通过绑定,当选择某个项目时,文本框可以变大或变小。
这会导致列表框移动。
当列表框移动时,所选项目不是被单击的项目。
所选项目是移动的ListBox 上鼠标下方的项目。
有时它甚至根本不会选择(尝试从 9 到 10 或从 10 到 9)。
在此代码中重现问题,偶数和奇数产生不同的长度。
因此,如果您从奇数到奇数或从偶数到偶数,那就没问题了。
如果您从顶部的奇数到底部的偶数(不滚动),那么有时会选择视图中不均匀的项目。
在实际代码中,文本框是项目的描述,并且描述的长度不同。
有趣的是在调试中, get { returnboundText; 上有一个断点;然后它会选择正确的项目。
我认为它会处理选择,然后测量 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();
}

我稍微重写了你的代码。诀窍是使用 MouseCapture 来避免进行多个事件处理(使用原始代码,由于按下鼠标按钮时布局发生变化,列表框一次单击最多可以选择三个选项)

这是代码:

主窗口.xaml

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="TextEditor.MainWindow"
        Title="MainWindow" Height="350" Width="525">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <TextBox Grid.Row="0" Text="{Binding Path=BoundText}" TextWrapping="Wrap" />
        <ListBox Grid.Row="1" 
                 ItemsSource="{Binding Path=BoundList}" 
                 SelectedItem="{Binding Path=BoundListSelected, Mode=TwoWay}"/>
    </Grid>

</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;

namespace TextEditor
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public string BoundText
        {
            get { return (string)GetValue(BoundTextProperty); }
            set { SetValue(BoundTextProperty, value); }
        }

        // Using a DependencyProperty as the backing store for BoundText.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty BoundTextProperty =
            DependencyProperty.Register("BoundText", typeof(string), typeof(MainWindow), new PropertyMetadata(string.Empty));

        public string BoundListSelected
        {
            get { return (string)GetValue(BoundListSelectedProperty); }
            set { SetValue(BoundListSelectedProperty, value); }
        }

        // Using a DependencyProperty as the backing store for BoundListSelected.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty BoundListSelectedProperty =
            DependencyProperty.Register("BoundListSelected", typeof(string), typeof(MainWindow), new PropertyMetadata(string.Empty, OnBoundListSelectedChanged));

        private static void OnBoundListSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var mainWindow = d as MainWindow;
            var value = e.NewValue as string;

            Mouse.Capture(mainWindow);

            if (Int32.Parse(value) % 2 == 0)
            {
                mainWindow.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
            {
                mainWindow.BoundText = value.ToString() + " something short ";
            }

            mainWindow.ReleaseMouseCapture();
        }

        public MainWindow()
        {
            for (int i = 0; i < 1000; i++)
            {
                boundList.Add(i.ToString());
            }

            InitializeComponent();
            DataContext = this;
        }

        public List<string> BoundList { get { return boundList; } }
        private List<string> boundList = new List<string>();
    }
}

Edit :我实际上改变了 MainWindow 的编码方式(没有必要在 DependencyObject 上实现 INotifyPropertyChanged,所以我只是将其删除并设置两个依赖属性),但是您可以尝试通过在设置 BoundText 之前捕获鼠标来解决您的原始代码问题,然后释放它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

列表框未选择所选项目 的相关文章

  • 从网络位置读取文件

    我在网络驱动器上共享的文件夹中有一堆文件 我正在尝试将这些文件访问到我的代码中 但它给出了一个错误 用户代码未处理 System IO DirectoryNotFoundException Fname txtwbs Text Directo
  • 在辅助监视器中创建 WPF 窗口时遇到问题

    我正在努力在应用程序中实现一些类似 Chrome 的选项卡功能 但在正确生成新实例时遇到一些问题 我已经对各种解决方案进行了大量搜索和迭代 但尚未能够在第二台显示器上生成新窗口 这是使用线程 打开文件 将当前选项卡拖至其他显示器 新的应用程
  • WPF DataGrid 的 EnableRowVirtualization 和 VirtualizingStackPanel.IsVirtualizing 属性之间的区别

    几乎没有关于环境影响的信息 VirtualizingStackPanel IsVirtualizing True and EnableRowVirtualization True EnableColumnVirtualization Tru
  • IEnumerable.GetEnumerator() 和 IEnumerable.GetEnumerator()

    在 net框架中 有一个通用的IEnumerable
  • 在 Datagrid wpf 上对数据进行分组

    我想使用包含组名称并包含所有 ClassMate 名称的扩展器重新组合我的数据 这是我的班级组 public class Group public List
  • 返回没有属性名称的 Json 结果

    很可能是一个相当微不足道的问题 但我就是找不到合适的答案 我想返回一个 JsonResult 但实际结果没有任何属性名称 这是我想要实现的一个小例子 xbox Xbox 360 Xbox cheats Xbox 360 games The
  • WPF:什么会导致 ComboBox 无法虚拟化?

    这是我的组合框 它似乎没有虚拟化 但我不明白为什么 您知道有什么会导致这种情况吗
  • .Net 将 NULL 值从变量值插入 SQL Server 数据库

    也有类似的问题 但答案不是我想要的 如果引用为 NULL 或尚未分配值 我想将 NULL 值插入 SQL Server 数据库 目前我正在测试 null 它看起来像 String testString null if testString
  • 在 Orchard 中设置唯一的主体类和 ID

    有没有办法在 Orchard 中为每页设置唯一的正文类和 ID 我希望能够在 编辑页面 部分控制这些 例如 主页的正文 ID 为 home 关于页面的正文 ID 为 about 等 并且 如果 about 页面下有子页面 这些页面将具有 a
  • C++/CLI 在运行时显式加载托管 DLL(相当于非托管的 LoadLibrary)

    问题一 有没有办法在 C CLI 中在运行时而不是在编译时显式加载库 目前我在编译时使用 NET 添加引用 我想显式加载托管 dll NET 中是否有 LoadLibrary 的等效项 Update 感谢兰多夫 Assembly LoadF
  • Sqlite 删除速度极其慢 - 如何加快速度?

    我读到删除操作很慢 我想知道如何改进此检查 我有一个每天填充 10 15k 行的表 每次启动时我都需要清理所有超过 6 个月的记录 但是当数据库增长时 我开始遇到速度问题 当我运行此命令时 有接近 100 万条记录 即使我没有任何内容要删除
  • 如何向 addrange select 语句添加异步“await”?

    我有一个这样的函数 public async Task
  • 透明窗口层可点击并始终位于顶部

    这是我尝试实现的一些代码 其目的是创建一个透明 全屏 无边框 可点击且始终位于其他窗口之上的表单层 然后 您可以使用 directx 在其顶部进行绘制 否则保持透明 不起作用的部分是点击部分和 directx 渲染 当我运行它时 我基本上在
  • C# 中将一个字符串拆分为另一个字符串

    我一直在使用Split 分割字符串的方法 但这似乎仅在您按字符分割字符串时才有效 有没有办法分割一个string 另一个字符串是按参数分割的 我尝试将拆分器转换为字符数组 但没有成功 换句话说 我想分割string THExxQUICKxx
  • 如何使用 MVVM 更新 WPF 中编辑的数据? [复制]

    这个问题在这里已经有答案了 我正在为聊天应用程序构建 UI 设计 在尝试更新所选联系人的消息时遇到问题 选择现有联系人 选择编辑选项 然后编辑其属性 例如用户名和图像 后 唯一进行的更改是联系人的用户名和图像 我仍然想更改 MessageM
  • 用户控件内所有控件均为空

    我有一个 UserControl 它使用 UserControl 以及其他控件 In the ascx文件我有以下代码
  • Windows 8 和 LOB 应用程序

    为 Windows 8 构建业务线应用程序的推荐方法是什么 例如复杂的定制财务应用程序 它们显然不适合 Metro 风格 因此可能会成为常规桌面应用程序 那么建议使用WPF吗 有 vNext 吗 我作为开发人员构建的应用程序类型是桌面风格的
  • 可观察集合未因 UI 更改而更新

    我正在尝试将可观察集合绑定到用户控件 但它不会在用户更改时更新 但在通过代码更改用户控件时它会更新 以下是我尝试过的一个例子 它可能有点长 但它正在运行 因此您可以按原样复制并粘贴代码 请参阅帖子末尾我的问题 客户 cs using Sys
  • 在 MVVM 中哪里可以捕获异常?

    我的视图模型类有一个连接到服务的方法 不确定这是否是一个好的实践 或者视图模型是否应该是严格的属性和属性更改机制 当然 我想在连接或断开连接时处理任何可能的 WCF 异常 让我们使用未找到端点作为示例 考虑到这是一个我想引起用户注意的异常
  • WPF 路径:如何在 XAML 中绘制它?

    我想创建一个带有非矩形标题的自定义 GroupBox 如下图所示 正如你所看到的 标题的内容必须是可参数化的 因此可以在xaml中输入图像 标题和背景 提前致谢 谢谢您的回答 实际上我想在自定义组框中使用这个设计 所以在你的答案中 如果我不

随机推荐

  • jq:打印对象中每个条目的键和值

    如何得到jq像这样获取 json host1 ip 10 1 2 3 host2 ip 10 1 2 2 host3 ip 10 1 18 1 并生成此输出 host1 10 1 2 3 host2 10 1 2 2 host3 10 1
  • Django 查询中的列比较

    我有以下模型 class Car models Model make models CharField max length 40 mileage limit models IntegerField mileage models Integ
  • 滥用设计模式

    在规范的 四人帮 列表中 是否有任何您经常发现误用 误解或过度使用的设计模式 除了备受争议的单例模式之外 换句话说 是否有一种设计模式您建议在使用之前三思而后行 为什么 工厂模式 我之前被空投到一个项目中 每个人都MyObject系统中有一
  • 从日期中分割日期和时间以单独键入

    我想这样做 Date meetingDateAndTime
  • 非负整数和小数值的验证

    我的字段是 tax rate and tax amount我想在其中验证积极的价值观 我写了这个验证 format gt with gt A d Z 但它并不是像这样取带小数点的数字4 67 它给我带来了一个错误 什么类型的验证适用于整数和
  • 某些曲目上的 SoundCloud API 403

    我已经有一个使用 soundcloud API 将 soundcloud 链接嵌入为有效播放器的应用程序有一段时间了 我最近注意到中等数量的403 Unauthorized从曲目查找返回的错误 api soundcloud com trac
  • UTF-8 和 TinyXML

    由于某种原因 我无法正确从 xml 文件读取数据 例如 我得到的不是 Schr der 而是类似 Schr der 的内容 My code tinyxml2 XMLDocument doc bool open string path if
  • InternalsVisibleTo 不适用于 wpf 应用程序

    我在另一个程序集中设置了 程序集 InternalsVisibleTo GuiAssembly 但是当 wpf 绑定发生在另一个程序集中的类上时 它会抛出异常 因为该类中的属性是内部的 我知道这适用于其他应用程序 但不确定为什么它不适用于这
  • SQL Server 递归 CTE 是否被视为循环?

    我的印象是递归 CTE 是基于集合的 但是在一个最近的SO帖子 https stackoverflow com questions 7824831 generate dates between date ranges 7824919 com
  • Python-Docx 缺少默认模板

    我最近安装了 python docx 包 但在使用默认模板时遇到了一些问题 我只是设置一个文档并具有以下代码 在名为 maintitle py 的文件中 from docx import Document from docx shared
  • K 表示使用 PySpark 进行聚类

    我有一个非常大的数据框 我必须使用数据框中的特定 8 列 其中值要么是 强烈同意 同意 或 不同意 根据这 8 列 我需要创建一个新列来告诉该行属于哪个簇 1 8 最好使用 K 均值聚类 这在 PySpark 中可能吗 PS 我是 PySp
  • CodeIgniter 动态语言功能

    我是 Codeigniter 我需要为用户提供动态语言 我在标题处添加了下拉菜单 我希望允许用户在前端更改网站的语言 我尝试在一个控制器中使用以下代码更改语言 this gt config gt set item language span
  • JProgressBar 未更新

    我制作了一个非常简单的代码来在此处显示它 我有一个按钮应该显示 JDialog 来检查进度状态 我正在使用延迟调用来完成 EDT 并且我的循环不在 run 方法中 那么为什么我的酒吧没有更新吗 这是代码 import javax swing
  • RSpec 场景概要:多个测试用例

    使用 RSpec 测试一堆不同测试用例的最佳方法是什么 例如 给定字符串添加 rb https gist github com 899520 require rspec class String if method defined reve
  • Spring RMI 的替代方案是什么? (因为它已被弃用)

    Spring 似乎正在弃用它的 RMI 从 Spring Framework 5 3 开始 出于安全原因和更广泛的行业支持 现已弃用对多种远程技术的支持 支持基础设施将从 Spring Framework 的下一个主要版本中删除 但我找不到
  • PyQt - 如何导入 .qss 文件?

    如何将 qt 的样式表 qss 文件导入到应用程序 在 HTML 中我们使用 那么如何在 PyQt 中完成呢 或者我可以在哪里阅读相关内容 无法通过谷歌搜索或在 Qt 文档中找到它 qss 文件是一个简单的文本文件 如果您想将样式表应用于您
  • 使用 WCF 流上传文件,从流中进行微小读取

    我已经使用WCF的流实现了文件上传 一切都按预期进行 但是我遇到了一个问题 我分配 4kb 缓冲区来从传入流中读取数据 但 WCF 仅读取 255 字节 这是我的上传功能 public UploadResponse UploadFile F
  • 一张 Microsoft SQL 表可以有多个主键吗?

    我一直很好奇 但找不到简洁的答案 有什么帮助吗 它不能有超过一个首要的关键 但是 它的主键中可以有多于一列 它也可以有多个唯一索引 通常 唯一索引是主键 但单个表上可以有多个唯一索引 我一时想不出一个例子 但当我想到的时候我会添加它 EDI
  • 如何修复 Eclipse 警告:“建议插件 'XXX' 从 JAR 运行,指定 'unpack="false"' 属性”

    该插件确实需要解压 是的 我知道它不应该关心 但它确实关心 我只是想让这个警告消失 我该怎么做 尝试设置Bundle ClassPath在你的清单中 这个头告诉 OSGi 在你的包中哪里可以找到这些类 如果未指定 则默认值为 这意味着你的包
  • 列表框未选择所选项目

    请参阅下面的代码视觉工作室2010ListBox 上方有一个 TextBox 通过绑定 当选择某个项目时 文本框可以变大或变小 这会导致列表框移动 当列表框移动时 所选项目不是被单击的项目 所选项目是移动的ListBox 上鼠标下方的项目