Сделать комбобокс невыбираемым? или лучше интерфейс? - PullRequest
0 голосов
/ 21 января 2010

Это может показаться странным ... но мне интересно, есть ли вообще возможность сделать выпадающий список недоступным для выбора. Таким образом, он отображается как обычно, за исключением того, что не может быть выбран. У меня есть 3 кнопки под ним, Редактировать, Отмена, Сохранить. (Отмена + сохранение, очевидно, не включено) План таков, что когда пользователь нажимает кнопку «Изменить», он может изменять элементы в поле со списком.

Я знаю, .IsEnabled сделает это, за исключением того, что он затуманивает управление и затрудняет чтение.

Попробую объяснить ситуацию дальше. У меня есть два списка со связанными предметами. Например, (я знаю, что это не совсем работает, но представьте, что производители автомобилей могут купить автомобили других производителей, а затем сделать так, чтобы они стали их собственными) Колонка производителей автомобилей и тип автомобиля.

Итак, мы имеем (в 2 отдельных списках)

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

Теперь, когда один из них выбран, я программно выбираю связанного с ним партнера, а затем отображаю оба элемента в двух комбинированных полях. Поле со списком для производителя содержит всех производителей, а поле для типа содержит все различные типы автомобилей, например, если, например, Ford покупает Astra, я выбираю Holden -> Astra, затем нажимаю edit в следующем представлении, меняю комбо типа производителя на Ford и нажимаю save.

Таким образом, у автомобиля может быть только один производитель автомобилей, но у производителя автомобилей может быть много автомобилей. Я хочу иметь возможность: а) показывать отношения б) редактировать отношения и в) (но не так важно) добавлять новые отношения, если добавляются автомобили (однако это происходит на другом экране, не беспокойтесь об этом)

Пользователь может добавлять и удалять компании и автомобили. Автомобиль может существовать без компании, а также с производителем. Не беспокойтесь о последствиях удаления, просто скажите, что список остался прежним.

Плохой пример, но легче объяснить, чем я на самом деле делаю ...

Может быть, у кого-то есть лучшая идея, как настроить это, но в конце дня все еще задаюсь вопросом, могу ли я сделать комбо-бокс, как я хочу?

IsEnabled=false делает его слишком нечитаемым.

IsReadOnly=true делает текст недоступным для редактирования.

Ответы [ 5 ]

2 голосов
/ 21 января 2010

Вы можете сделать любой элемент управления, включая <ComboBox> без фокуса и без щелчка, установив эти два свойства:

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

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

(Другой вариант - использовать VisualBrush и тайно заменить ComboBox изображением, но это, вероятно, излишне для этой ситуации.)

Обновление

Как указывает Тони, плохой дизайн пользовательского интерфейса - иметь элемент управления, который выглядит кликабельным, но это не так. Вы можете избежать этого, изменив шаблон ComboBox, когда IsHitTestVisible = "false". Просто добавьте что-то подобное в ваш стиль ComboBox:

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

Это также требует, чтобы вы определили ControlTemplate с ключом ресурса NonClickableComboBoxTemplate, который обеспечивает внешний вид для не кликабельного ComboBox.

1 голос
/ 21 января 2010

Предполагая несколько вещей, пока я жду (или даже не жду) ответов на мои комментарии выше, я предлагаю:

Один список с 2 столбцами. Тип автомобиля слева, так как он не может быть продублирован в списке и, таким образом, в некоторой степени находится под контролем отношений:


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

Нажатие на конкретную компанию вызывает раскрытие списка возможных компаний для данного автомобиля. то есть нажатие на «Ford» в первой строке (для Falcon) показывает выпадающий список

Ford
Holden
Toyota

Пользователь выбирает тот, который он хочет, а затем вы идете. (Это означает, что вы можете сделать все автомобили принадлежащими одной и той же компании, поэтому в некоторых компаниях может не быть автомобилей. Если это проблема, вы, возможно, можете проверить и вывести сообщение «Каждой компании нужен хотя бы один автомобиль» и т. Д.). )

Выбрав заголовки (Тип или Компания), вы можете отсортировать списки. Таким образом, увидев все заказанные вместе автомобили Holden и т. Д.

Обратите внимание, что вы НЕ МОЖЕТЕ щелкнуть запись в столбце «Тип», т. Е. Вы не можете изменить строку 2 с «Astra» на «Comm». Это, вероятно, хорошо, потому что это делает невозможным двойное перечисление одной и той же пары.

Если ваш реальный пример действительно подразумевает Company -> Car 'order', то вы можете изменить порядок столбцов. Но обычно не редактируемый «контрольный» столбец находится слева. (Потому что мы читаем слева направо. В областях, где есть языки справа налево, вы должны переключаться в любом порядке - OK / Отмена и т. Д.)

0 голосов
/ 21 января 2010

Эй, ты используешь wpf! Простое и точное решение: просто отредактируйте шаблон ComboBox в blend и удалите Trigger for IsEnabled

Вот как:

  • Щелкните правой кнопкой мыши свой комбинированный список в смеси
  • Выберите «Редактировать шаблон»> «Редактировать копию»
  • Дайте любое имя по своему вкусу. Я выбрал «ComboBoxStyle1». Определите этот стиль в наиболее подходящем месте. Я определил это в «Этот документ> Окно»
  • Теперь перейдите к «View> Active Document View> XAML view» из строки меню.
  • Теперь перейдите в раздел

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

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

</Style>

  • В этом разделе найдите и удалите следующий раздел

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

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

</Trigger>

  • Сохранить. И все хорошо ..!
0 голосов
/ 21 января 2010

Если вы просто хотите отключить ваше поле со списком, но его легче читать, просто измените копию шаблона.

In Blend ...

Объект -> Редактировать шаблон -> Редактировать копию ...

Затем найдите раздел для отключенного состояния и измените его так, как вам нравится.

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

Затем установите непрозрачность примерно на 0,9

.
0 голосов
/ 21 января 2010

Что касается случаев, когда вы не хотите, чтобы выпадающий список был редактируемым, вы обрабатываете событие Enter, фокусируясь на другом месте. Без его проверки вам, возможно, придется сделать то же самое с событием Click (не уверен, что в случае, если щелчок сработает Enter).

Таким образом, текст остается видимым, но пользователь не может редактировать текст или выделение.

После того, как пользователь нажмет кнопку «Редактировать», отключите обработчик (и).

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