【问题标题】:Interaction with ListBox in WPF Popup does not work与 WPF Popup 中的 ListBox 交互不起作用
【发布时间】:2012-10-23 08:30:45
【问题描述】:

我想创建一个控件,让我可以为文本框中的值选择单位。为了实现这一点,我在文本框后附加了一个按钮,并在悬停时打开了一个弹出窗口,其中包含一个带有可用单位的列表框。

如果我在此弹出窗口中放置一个按钮一切正常,我将获得悬停效果并可以单击该按钮。但是 ListBox 不能按预期工作。没有做任何特别的事情,我无法单击或聚焦 ListBox 项目。将弹出窗口的 F​​ocusManager.IsFocusScope 设置为 true 可以让我通过两次单击来选择一个项目,首先是关注窗口,其次是关注我想的 ListBox。以编程方式移动焦点也没有帮助。

示例弹出窗口:

<Popup x:Name="PART_UnitPopup" 
  PlacementTarget="{Binding}" 
  Placement="Bottom">
  <StackPanel>
    <ListBox x:Name="PART_UnitPopupListBox" ItemsSource="{Binding,Path=Units}"/>
    <Button Content="Click me!" />
  </StackPanel>
</Popup>

阅读一些内容并尝试了一些解决方案,将焦点移到弹出窗口的打开或焦点事件上,但不能像按钮那样以正常样式运行。也许除了 popop 之外还有另一种方法来完成这项任务,但它似乎是一个很好的解决方案,我发现了一堆据说可以工作并且差别不大的代码。

【问题讨论】:

  • 听起来很复杂。为什么不简单地使用 ComboBox 来选择单位,而不是使用带有 Popup 的按钮。
  • 这是一个设计和可用性要求,所以以这种方式设计它(小而简单的按钮和弹出行为)。也考虑过手动使用窗口,但定位可能具有挑战性。

标签: wpf listbox popup focus


【解决方案1】:

我找到了一个与真正的解决方案有点距离的解决方法,但我想分享一下。 因为按钮接缝效果很好,所以我将按钮放入 ListBox 项目模板中,并更改了样式以使它们看起来像平面对象。现在,无需单击两次即可进行悬停和交互。

作为一个陷阱,我不再能够依赖选择更改事件,因为按钮会拦截所有点击。因此,我向按钮添加了一个命令,该命令与更改的处理程序之前所做的工作相同。这基本上完成了工作,但其他想法将不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2014-09-27
    相关资源
    最近更新 更多