禁用ComboBox而不更改外观

时间:2009-05-19 15:25:22

标签: c# wpf combobox

有没有办法禁用在WPF中更改ComboBox的值而不给它一个禁用的ComboBox的可视属性?例如,我知道对于文本字段,您可以将IsReadOnly属性设置为true。但是,对ComboBox执行此操作不会阻止用户选择其他值。

7 个答案:

答案 0 :(得分:8)

先生。 Benages,我认为在ComboBox上将IsHitTestVisible和Focusable设置为false可能会成功。希望这会有所帮助。

答案 1 :(得分:4)

虽然我同意禁用的控件应该看起来已禁用,但您可以将ComboBox ControlTemplate设置为标准的(或使用的)删除任何标准功能

例如,这将给你一个体面的只读组合框

  <ComboBox>
    <ComboBox.Template>
        <ControlTemplate TargetType="{x:Type ComboBox}">
          <Grid>
            <Microsoft_Windows_Themes:ListBoxChrome x:Name="Border" Height="23" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" RenderMouseOver="{TemplateBinding IsMouseOver}"/>
            <TextBlock FontSize="{TemplateBinding FontSize}" VerticalAlignment="Center" Text="Selected Item" Margin="5,0,0,0"></TextBlock>
          </Grid>
      </ControlTemplate>
    </ComboBox.Template>
  </ComboBox>

您需要包含以下命名空间

xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"

答案 2 :(得分:0)

从可用性/惯例的角度来看,您确定这是一个好主意吗?如果您的目标是可读性,也许您可​​以更改禁用的颜色以稍微提高对比度。

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/45dd7614-326b-4a51-b809-d25a3ff1ade8/

无论如何,我怀疑你可以编写一个onChange事件处理程序来将值重置为上一个条目。

答案 3 :(得分:0)

您可以设置前景色和背景色,这似乎会覆盖禁用的颜色。下拉按钮显示为已禁用,这很好。

编辑我的代码我在IE 6 / Kaxaml中测试过。

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel>
  <ComboBox  Foreground="black" Background="white" IsEditable="True" Text="Hello" IsEnabled="false">
  <ComboBoxItem>Test1</ComboBoxItem>
  <ComboBoxItem>Test2</ComboBoxItem>
  <ComboBoxItem>Test3</ComboBoxItem>
  </ComboBox>
  </StackPanel>
</Page>

答案 4 :(得分:0)

我不确定它在.net中是否相同然而在VB6天我用来获取一个图片框,框架或其他容器(对不起我的头顶我不记得哪个)。我会把组合框放在那里。对于用户来说它看起来是一样的。当您禁用容器时,这也会锁定组合框,使其看起来正常。

答案 5 :(得分:0)

为什么然后使用comboBox。

我的选择是边框内的标签取代控件,表明这是一个仅显示屏幕。

如果它看起来像一个组合框,最好使用一个像按钮那样主题但不可点击的对象。您甚至可以绘制一个灰色的下拉箭头,以便它看起来更像是一个组合框。

当标签显示正常时,屏幕上实际上有一个人们无法与之交互的组合框似乎有点过分。

答案 6 :(得分:0)

  
    

...阻止用户选择其他值。

  

除了样式之外,您还可以通过覆盖一些ComboBox方法来禁用键盘输入:

using System.Windows.Controls;
using System.Windows.Forms;
using System.Windows.Input;

public class LockableComboBox : ComboBox
{

    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        if (this.IsReadOnly)
        {
            e.Handled = true;
        }
        else
        {
            base.OnSelectionChanged(e);
        }
    }

    protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        if (this.IsReadOnly)
        {
            if ((e.Key == Key.C || e.Key == Key.Insert)
                && (Keyboard.Modifiers & ModifierKeys.Control) 
                == ModifierKeys.Control)
            {
                // Allow copy
                Clipboard.SetDataObject(SelectedValue, true);
            }
            e.Handled = true;
        }
        else
        {
            base.OnPreviewKeyDown(e);
        }
    }

    protected override void OnPreviewTextInput(TextCompositionEventArgs e)
    {
        if (this.IsReadOnly) 
        {
            e.Handled = true;
        }
        else
        {
            base.OnPreviewTextInput(e);
        }
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        if (this.IsReadOnly)
        {
            e.Handled = true;
        }
        else
        {
            base.OnKeyUp(e);
        }
    }
}