Отключить ComboBox без изменения внешнего вида - PullRequest
3 голосов
/ 19 мая 2009

Есть ли способ отключить изменение значения ComboBox в WPF без предоставления ему визуальных свойств отключенного ComboBox? Например, я знаю, что для текстового поля вы можете установить для свойства IsReadOnly значение true. Однако выполнение этого для ComboBox не мешает пользователю выбрать другое значение.

Ответы [ 7 ]

8 голосов
/ 19 мая 2009

г. Benages, я думаю, что установка IsHitTestVisible и Focusable на false в ComboBox может помочь. Надеюсь, это поможет.

4 голосов
/ 19 мая 2009

Хотя я согласен с тем, что отключенный элемент управления должен выглядеть отключенным, вы можете просто установить 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"
0 голосов
/ 28 марта 2013

... запретить пользователю выбирать другое значение.

Помимо стиля вы можете отключить ввод с клавиатуры, переопределив некоторые методы 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);
        }
    }
}
0 голосов
/ 17 июля 2012

Зачем тогда использовать comboBox.

Моим выбором будет метка в рамке, которая занимает место элемента управления, указывающая, что это экран только для отображения.

Если он должен выглядеть как выпадающий список, было бы лучше использовать объект в виде кнопки, но не кликабельный. Вы даже можете нарисовать серую стрелку раскрывающегося списка, чтобы она лучше выглядела как комбинированный список.

Просто кажется чрезмерным иметь на экране комбо-бокс, с которым люди не могут взаимодействовать, когда с этикеткой все будет хорошо.

0 голосов
/ 19 мая 2009

Я не уверен, что это то же самое в .net, однако в те дни VB6, которые я использую, чтобы получить коробку с картинками, рамку или другой контейнер (извините за голову, я не могу вспомнить, какой именно). Я бы положил в этот список. Для пользователей это выглядит так же. Когда вы отключаете контейнер, это также блокирует поле со списком, оставляя его нормальным.

0 голосов
/ 19 мая 2009

Вы можете установить цвета переднего плана и фона, и это, кажется, перекрывает отключенные цвета. Кнопка с раскрывающимся списком показывает, что она отключена, и это хорошо.

РЕДАКТИРОВАТЬ Мой код, который я тестировал в 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>
0 голосов
/ 19 мая 2009

Вы уверены, что это хорошая идея с точки зрения юзабилити / соглашений? Если ваша цель - удобочитаемость, возможно, вы можете изменить отключенный цвет, чтобы немного увеличить контраст.

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

В любом случае, я подозреваю, что вы могли бы написать обработчик события onChange для сброса значения до предыдущей записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...