使组合框不可选?或更好的UI?

时间:2010-01-21 04:27:34

标签: c# wpf visual-studio-2008 user-interface combobox

这可能看起来很奇怪......但是我想知道是否还有一个组合框是不可选择的。因此它显示为正常,但不能选择。 我下面有3个按钮,编辑,取消,保存。 (取消+保存显然未启用)计划是这样的,当用户点击编辑时,他们可以更改组合框中的项目。

我知道.IsEnabled会执行此操作,除非它会使控件变灰并使其难以阅读。

将尝试进一步解释这种情况。我有两个相关项目的列表。例如,(我知道这不太合适,但想象一下,汽车制造商可以购买其他制造商的汽车然后让它们成为他们的汽车制造商专栏和车型。

所以我们(在2个单独的列表框中)

Holden -> Commodore
Holden -> Astra
Ford -> Falcon

现在当选择一个时,我以编程方式选择其相关伙伴,然后在两个组合框中显示这两个项目。制造商的组合框包含所有制造商,该类型的框包含所有不同的汽车类型,因此,例如,福特购买Astra,我选择Holden - > Astra,然后在下一个视图中单击编辑,将制造商类型组合更改为Ford,然后单击“保存”。

所以关系是,一辆汽车只能有一家汽车制造商,但汽车制造商可以有很多汽车。我想能够a)显示关系b)编辑关系和c)(但不是那么重要)如果添加汽车则添加新的关系(这在不同的屏幕中发生,但不要担心)

用户可以添加和删除公司和汽车。汽车可以在没有公司的情况下存在,也可以与制造商存在。不要过分担心这里的删除含义,只是说列表保持不变。

不好的例子,但比我实际做的更容易解释......

也许某人有更好的想法如何设置,但在一天结束时仍然想知道我是否可以像我想的那样制作组合框?

IsEnabled=false太难以理解了。

IsReadOnly=true使文字无法使用。

5 个答案:

答案 0 :(得分:2)

您可以通过设置以下两个属性来进行任何控制,包括<ComboBox>不可聚焦和不可点击:

<ComboBox Focusable="false" IsHitTestVisible="false" />

这通常可以解决问题。控件在视觉上保持不变,但您无法使用鼠标,键盘或手写笔与其进行交互。

(另一种选择是使用VisualBrush并秘密地将ComboBox替换为它的图片,但这对于这种情况可能有点过头了。)

<强>更新

正如托尼指出的那样,设置一个看似可点击的控件却不是很糟糕的UI设计。您可以通过在IsHitTestVisible =“false”时更改ComboBox模板来避免这种情况。只需将这样的内容添加到您的ComboBox样式中:

<Style.Triggers>
  <Trigger Property="IsHitTestVisible" Value="False">
    <Setter Property="Template"
            Value="{StaticResource NonClickablComboBoxTemplate}" />
  </Trigger>
</Style.Triggers>

这还要求您定义一个ControlTemplate,其中包含资源键NonClickableComboBoxTemplate,用于提供不可引用的ComboBox的外观。

答案 1 :(得分:1)

在我等待(或实际上不等待)上述评论的答案时假设一些事情,我建议:

单个列表框,包含2列。汽车类型在左侧,因为它不能在列表中重复,因此在某种程度上更多地“控制”关系:


Type       Company
-------+-----------
Falcon      Ford
Astra       Holden
Comm...     Holden

点击特定公司会显示某辆车的可能公司的下拉列表。即点击第一行中的'Ford'(对于Falcon)显示

的下拉列表
Ford
Holden
Toyota

用户选择他们想要的那个然后你离开。 (这意味着你可以让同一家公司拥有所有汽车,因此有些公司可能没有汽车。如果这是一个问题,你可以检查并张贴一个消息框'每家公司至少需要一辆汽车'等。 )

通过选择标题(类型或公司),您可以对列表进行排序。因此,看到所有霍顿汽车一起订购等等。

请注意,您无法单击“类型”列中的条目 - 即您无法将第2行从“Astra”更改为“Comm”。这可能是好的,因为这使得无法将相同的配对列出两次。

如果你真实的例子真的意味着公司 - &gt;汽车'订单'然后您可以切换列的顺序。但通常不可编辑的“控制”栏位于左侧。 (因为我们从左到右阅读。在有从右到左语言的区域,您应该切换到所有内容的顺序 - 确定/取消等。)

答案 2 :(得分:0)

当您不希望组合框可编辑时,您可以通过将焦点放在其他位置来处理Enter事件。如果不对其进行测试,您可能需要对Click事件执行相同操作(如果点击触发Enter,则无法确定。)

这样文本仍然可见,但用户无法编辑文本或选择。

用户单击“编辑”按钮后,禁用处理程序。

答案 3 :(得分:0)

如果您只是想让您的组合框被禁用但更容易阅读,那么只需修改模板的副本。

在Blend ......

对象 - &gt;编辑模板 - &gt;编辑副本...

然后找到禁用状态的部分并将其更改为您喜欢的样式。

<VisualState x:Name="Disabled">
<Storyboard>
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="DisabledVisualElement" Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00" Value=".55"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

然后将不透明度设置为0.9

答案 4 :(得分:0)

嘿,你用的是wpf!简单而准确的解决方案:只需在混合中编辑ComboBox模板,然后删除Trigger for IsEnabled

以下是:

  • 右键单击混合中的组合框
  • 选择修改模板&gt;编辑副本
  • 为您的风格提供您喜欢的任何名称。我选择了“ComboBoxStyle1”。在最合适的位置定义此样式。我在“本文档&gt;窗口”
  • 中定义了它
  • 现在从菜单栏转到“查看&gt;活动文档视图&gt; XAML视图”。
  • 现在转到
  • 部分
  

<Style x:Key="ComboBoxStyle1" TargetType="{x:Type ComboBox}">

      ..............  
     

</Style>

  • 在此部分中,搜索并删除以下部分
  

<Trigger Property="IsEnabled" Value="false">

      ..............
     

</Trigger>

  • 保存。 aal izz well ..!