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