2010-01-21 6 views
0

Это может показаться странным ... но мне интересно, если все равно сделать комбобокс нецелесообразным. Таким образом, он отображается как обычный, за исключением того, что он не может быть выбран. У меня есть 3 кнопки под ним, Edit, Cancel, Save. (Отмена + сохранение, очевидно, не включено). План таков, когда пользователь нажимает на редактирование, они могут изменять элементы в поле со списком.Сделать комбобокс невыбираемым? или лучший пользовательский интерфейс?

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

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

Таким образом, мы имеем (в 2-х отдельных ListBoxes)

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

Теперь, когда выбран один, я программно сделать выбранный связанный с ним партнер, а затем отображать как элементы в двух коробках Combo. В поле со списком для производителя входят все производители, а коробка для этого типа содержит все типы автомобилей, поэтому, если, например, Форд покупает Astra, я выбираю Holden -> Astra, затем нажмите «Изменить» в следующем представлении, измените комбинацию типа производителя на Ford и нажмите «Сохранить».

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

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

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

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

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

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

+0

Ваш пример (Ford покупает astra ...) правильно, или вы его смешивали? В любом случае, я предполагаю, что это один-ко-многим, но не наоборот? (т. е. холден карты как для Commodore, так и для Astra, но Astra не может отображать как Holden, так и Ford). И, в общем, учитывая сопоставление в вашем примере, вы хотите иметь возможность (A) показать отношения; и (B) отредактировать отношения. Верный? – tony

+0

Можете ли вы также добавить автомобили или компании? Или удалить их? т.е. может ли пользователь добавить Toyota или полностью удалить Falcon? Или изменить отношения? Может ли автомобиль существовать без компании? Или компания без автомобиля? – tony

+0

извините, очень устал :) исправил мой вопрос. – baron

ответ

2

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

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

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

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

Update

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

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

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

+0

Каждый день я читаю что-то, что заставляет меня понять, насколько глубоко мое незнание WPF идет, и сегодня это все. –

+0

его фактически просто свойство IsHitTestVisible, IsFocusable не существует для Combobox, но IsHitTestVisible достигает того, что я был в этом вопросе. Cheers – baron

+0

Извините - я иногда забываю имена объектов, прежде чем вводить их. Имя первого свойства на самом деле «Focusable», а не «IsFocusable». Я отредактировал вопрос. Вероятно, вы хотите установить Focusable здесь, а не только IsHitTestVisible, потому что в противном случае пользователь может перейти к вашему управлению с помощью клавиатуры и внести изменения, даже если они не могут щелкнуть по нему. –

1

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

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

 

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

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

 
Ford 
Holden 
Toyota 

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

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

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

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

+0

Как вы это делаете, когда вы выбираете элементы в списке, который в этом случае является одним из элементов, появляется выпадающее меню? У меня есть комбинированные коробки, как я думал? или .. – baron

+0

Вы можете встроить комбинированный ящик внутри элемента списка. Не знаю, как, но я видел это несколько раз. Или на самом деле не встроен, но создан на месте щелчка, а затем уничтожен, как только вы закончите с ним. То же самое с «редактированием на месте» полей - окно редактирования встроено и/или создается на месте по мере необходимости. Это обычная идиома. Придерживаясь своего оригинального пользовательского интерфейса, нестандартно, и я просто думаю, что это будет запутать пользователей. – tony

+0

Я с тобой согласен ... Следующий шаг мне нужно выяснить, как это сделать. Хотя я думаю, что буду придерживаться двух отдельных списков, поэтому мне не нужно беспокоиться о редактировании сразу двух элементов (если вы понимаете, что я имею в виду). У меня есть список, запрограммированный для прокрутки в синхронизации - поэтому сохранение отношений ясно не является проблемой. Спасибо за ваши идеи! – baron

0

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

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

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

0

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

В Blend, ...

Object -> Edit Template -> Редактировать копию ...

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

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

Затем установите Opacity на что-то вроде 0,9

0

Эй, u'r с помощью WPF! Простое и точное решение: Просто измените шаблон ComboBox в смеси и удалить триггер для IsEnabled

Вот как:

  • правой кнопкой мыши ваш выпадающий в смеси
  • Выберите Edit Template> Изменить копию
  • Give любое имя, которое вам нравится в вашем стиле. Я выбрал «ComboBoxStyle1». Определите этот стиль в наиболее подходящем месте. Я определил его в «Этот документ> Окно»
  • Теперь перейдите в «Вид»> «Просмотр активного документа»> «Просмотр XAML» в строке меню.
  • Теперь перейдите в раздел

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

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

</Style>

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

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

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

</Trigger>

  • Сохранить. И aal izz хорошо ..!
Смежные вопросы