【问题标题】:XAML ReadOnly ComboBoxXAML 只读组合框
【发布时间】:2011-02-03 02:47:34
【问题描述】:

要在 XAML (WPF) 中设置只读 ComboBox,您必须根据一对属性 IsReadOnly/IsEditable 设置一个 ComboBox 和一个 TextBox 仅显示其中一个必须存在于您的ViewModel 上。请注意,在此示例中,“UserNVL”必须存在于资源中,并且它应该是一个NameValueList 集合,允许我们将ID 转换为名称。在这种情况下,RecipientID 是用户名的键。另请注意,VisibilityConverter 也必须存在于资源中,它是标准的 BooleanToVisibilityConverter

天哪!这很难找到,我不得不自己做。这允许用户选择文本框的内容。被禁用的ComboBox 绝不会允许你这样做。

【问题讨论】:

  • 我投票结束这个问题,因为它不是一个问题。

标签: wpf xaml combobox readonly


【解决方案1】:

有两个名为 IsHitTestVisible 和 IsTabVisible 的属性。前者使控件对鼠标事件充耳不闻,后者对键盘事件充耳不闻。 这可能会对您有所帮助,因为它不会使您的组合框看起来像残疾人,但您将成功地制作一个只读组合框.. 来源 :- http://www.telerik.com/community/forums/wpf/combobox/isreadonly-does-seem-to-work.aspx

【讨论】:

    【解决方案2】:

    为什么不直接设置 IsEnabled=false?

    【讨论】:

    • 为什么?我问过我的用户同样的问题。似乎禁用的文本框和禁用的组合框看起来如此不同,用户询问“这个灰色的东西”是否不能像下面的文本框,它非常好,更容易阅读,他们可以在哪里选择内容。
    • 另外,只读应该允许复制值。
    【解决方案3】:
    <DockPanel>
      <TextBlock Text="Recipient" Margin="6,9,3,6" HorizontalAlignment="Right"/>
      <ComboBox
          x:Name="RecipientID"
          ItemsSource="{Binding Source={StaticResource UserNVL}}"
          DisplayMemberPath="Value"
          SelectedValuePath="Key"
          SelectedValue="{Binding Path=RecipientID}"
          Height="20"
          Margin="6,6,0,6"
          MinWidth="200"
          HorizontalAlignment="Left"
          IsEditable ="True"
          Visibility="{Binding Path=IsEditable, Converter={StaticResource VisibilityConverter}}"/>
      <TextBox
          x:Name="RecipientName"
          Text="{Binding ElementName=RecipientID, Path=Text}"
          Margin="6,6,0,6"
          MinWidth="200"
          HorizontalAlignment="Left"
          Style="{StaticResource textBoxInError}"
          Visibility="{Binding Path=IsReadOnly, Converter={StaticResource VisibilityConverter}}"/>
    </DockPanel>
    

    【讨论】:

      【解决方案4】:

      我认为您会发现以这种非常简单的方式创建一个类来扩展 ComboBox 类会更加容易和实用:

      1. 覆盖 Combobox 的 OnSelectionChanged 方法以检查属性 IsReadOnly 之前允许 base.OnSelectionChanged(e) 运行。

      这样您只需将 ComboBox.IsReadOnly 属性设置为 True。没有大的 XAML 可以到处写...

      【讨论】:

        【解决方案5】:

        如果 IsEnabled 设置为 false,则 Combobox 值几乎不可读。我发现合适的解决方案是:

        • 组合框和文本框(格式为只读)位于相同的网格位置
        • 组合框跨越到下一列以获得额外的 15 宽度,因此下拉按钮可见
        • textbox.IsVisible 绑定到 combobox.IsEnabled 和 bool 到可见性转换器。
        • textbox.Text 绑定到 combobox.SelectedItem(在我的情况下它是强类型的,所以我实际上绑定到它的 .DisplayText)

        【讨论】:

          【解决方案6】:

          这是一个自定义 ComboBox 子类,它提供了我的场景所需的只读行为:

          public class ReadOnlyComboBox : ComboBox
          {
              static ReadOnlyComboBox()
              {
                  IsDropDownOpenProperty.OverrideMetadata(typeof(ReadOnlyComboBox), new FrameworkPropertyMetadata(
                      propertyChangedCallback: delegate { },
                      coerceValueCallback: (d, value) =>
                      {
                          if (((ReadOnlyComboBox)d).IsReadOnly)
                          {
                              // Prohibit opening the drop down when read only.
                              return false;
                          }
          
                          return value;
                      }));
          
                  IsReadOnlyProperty.OverrideMetadata(typeof(ReadOnlyComboBox), new FrameworkPropertyMetadata(
                      propertyChangedCallback: (d, e) =>
                      {
                          // When setting "read only" to false, close the drop down.
                          if (e.NewValue is true)
                          {
                              ((ReadOnlyComboBox)d).IsDropDownOpen = false;
                          }
                      }));
              }
          
              protected override void OnSelectionChanged(SelectionChangedEventArgs e)
              {
                  if (IsReadOnly)
                  {
                      // Disallow changing the selection when read only.
                      e.Handled = true;
                      return;
                  }
          
                  base.OnSelectionChanged(e);
              }
          }
          

          关于这种方法的要点:

          • 与引入额外 UI 元素的方法不同,不会破坏应用于元素的任何现有样式。
          • 只读时不会中断输入焦点。您仍然可以进入并单击以聚焦此元素。这更容易获得,这在我的场景中是一个问题。
          • 默认情况下,UI 元素在只读时看起来没有任何不同。如果需要,则必须应用相关样式才能做到这一点。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-09-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-24
            • 1970-01-01
            • 2017-05-28
            • 1970-01-01
            相关资源
            最近更新 更多