2010-01-21 3 views
0

Cela peut sembler étrange ... mais je me demande s'il y a de toute façon pour rendre une liste déroulante non sélectionnable. Donc, il affiche comme normal, sauf ne peut pas être sélectionné. J'ai 3 boutons en dessous, Modifier, Annuler, Enregistrer. (Annuler + enregistrer évidemment pas activé) Le plan est ainsi quand l'utilisateur frappe l'édition, ils peuvent changer les articles dans la zone de liste déroulante.Rendre la liste déroulante non sélectionnable? ou une meilleure interface utilisateur?

Je sais que .IsEnabled le fera, sauf qu'il grise le contrôle et le rend difficile à lire.

Nous essaierons d'expliquer davantage la situation. J'ai deux listes avec des éléments connexes. Par exemple, (je sais que cela ne fonctionne pas tout à fait, mais imaginez comme si les constructeurs automobiles pouvaient acheter d'autres voitures de fabricants et les faire devenir les leurs) Colonne du constructeur automobile, et type de voiture.

Nous avons donc (en 2 listboxes séparés)

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

Maintenant, quand on est sélectionné, je fais programatically son partenaire lié sélectionné, puis afficher les articles dans deux boîtes Combo. La liste déroulante pour le fabricant contient tous les fabricants et la boîte pour le type contient tous les différents types de voitures, donc si par exemple. Ford achète l'Astra, je sélectionne Holden -> Astra, puis cliquez sur modifier dans la vue suivante, modifiez le type de combo fabricant à Ford puis cliquez sur Enregistrer. Donc, la relation est, une voiture ne peut avoir qu'un seul constructeur automobile, mais un constructeur automobile peut avoir beaucoup de voitures. Je veux pouvoir a) montrer les relations b) éditer les relations et c) (mais pas si important) ajouter de nouvelles relations si des voitures sont ajoutées (cela se produit dans un écran différent cependant, ne vous inquiétez pas à ce sujet)

L'utilisateur peut ajouter et supprimer des sociétés et des voitures. Une voiture peut exister sans une entreprise et de même avec un fabricant. Ne vous inquiétez pas trop de la suppression des implications ici, dites simplement que la liste reste la même.

mauvais exemple, mais plus facile à expliquer que ce que je suis en fait faire ...

Peut-être que quelqu'un a une meilleure idée de comment mettre cela sur pied, mais à la fin de la journée à se demander encore si je peux faire la combobox comme je veux?

IsEnabled=false le rend trop illisible.

IsReadOnly=true rend le texte non modifiable.

+0

Est-ce que votre exemple (Ford achète astra ...) est correct, ou l'avez-vous mélangé? De toute façon, je suppose que c'est un-à-plusieurs, mais pas l'inverse? (c.-à-d. Holden correspond à la fois à Commodore et à Astra, mais Astra ne peut pas cartographier à la fois Holden et Ford). Et, en général, étant donné le mapping dans votre exemple, vous voulez pouvoir (A) montrer les relations; et (B) éditer les relations. Correct? – tony

+0

L'utilisateur peut également ajouter des voitures et/ou des entreprises? Ou les supprimer? Est-ce que l'utilisateur peut ajouter Toyota ou supprimer complètement le Falcon? Ou seulement changer la relation? Une voiture peut-elle exister sans une entreprise? Ou une entreprise sans voiture? – tony

+0

désolé, très fatigué :) ont réparé ma question. – baron

Répondre

2

Vous pouvez faire un contrôle, y compris <ComboBox> non focalisable et non cliquable en définissant ces deux propriétés:

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

Cela fait habituellement le tour. Le contrôle est visuellement inchangé, mais vous ne pouvez pas interagir avec la souris, le clavier ou le stylet.

(Une autre option est d'utiliser un VisualBrush et remplacer secrètement le ComboBox avec une photo de celui-ci, mais qui est probablement excessif pour cette situation.)

Mise à jour

Comme le souligne Tony sur, il La mauvaise conception de l'interface utilisateur est d'avoir un contrôle qui semble cliquable mais qui ne l'est pas. Vous pouvez éviter cela en modifiant le modèle ComboBox lorsque IsHitTestVisible = "false". Il suffit d'ajouter quelque chose comme ceci à votre style ComboBox:

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

Cela vous oblige aussi à définir une ressource clé ControlTemplate avec NonClickableComboBoxTemplate qui fournit le look pour le ComboBox non clicable.

+0

Chaque jour, je lis quelque chose qui me fait réaliser à quel point mon ignorance de WPF est profonde, et aujourd'hui c'est tout. –

+0

est en fait juste la propriété IsHitTestVisible, le IsFocusable n'existe pas pour Combobox, mais le IsHitTestVisible atteint ce que je recherchais dans cette question. Cheers – baron

+0

Désolé - j'oublie parfois de sur les noms de propriétés avant de les taper. Le nom de la première propriété est en fait "Focusable" et non "IsFocusable". J'ai édité la question. Vous voulez probablement définir ici Focusable et pas seulement IsHitTestVisible, car sinon l'utilisateur peut tabuler votre contrôle avec le clavier et apporter des modifications même s'il ne peut pas cliquer dessus. –

1

En supposant un certain nombre de choses pendant que j'attends (ou en fait pas attendre) pour obtenir des réponses à mes commentaires ci-dessus, je propose:

Une seule zone de liste, avec 2 colonnes. Type de voiture sur la gauche, car il ne peut pas être reproduit dans la liste, et est donc d'une certaine manière plus « contrôle » de la relation:

 

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

En cliquant sur une entreprise donnée fait apparaître une liste déroulante de la entreprises possibles pour une voiture donnée. à-dire en cliquant sur « Ford » dans la première ligne (Falcon) montre une liste déroulante des

 
Ford 
Holden 
Toyota 

L'utilisateur sélectionne celui qu'ils veulent alors vous partez. (Cela signifie que vous pouvez faire toutes les voitures appartenant à la même société, donc certaines entreprises peuvent ne pas avoir de voitures.Si c'est un problème, vous pouvez probablement vérifier et mettre en place un message «Chaque entreprise a besoin d'au moins une voiture» etc.

En sélectionnant les en-têtes (Type ou Société), vous pouvez trier les listes. Remarquez que vous NE POUVEZ PAS cliquer sur une entrée dans la colonne Type - c'est-à-dire que vous ne pouvez pas changer la ligne 2 de 'Astra' à 'Comm'. C'est probablement bon car cela rend impossible d'avoir deux fois le même appariement.

Si votre exemple réel implique réellement Company -> Car 'order', vous pouvez changer l'ordre des colonnes. Mais généralement, la colonne "contrôle" non modifiable est sur la gauche. (Parce que nous lisons de gauche à droite Dans les zones qui ont des langues de droite à gauche, vous devez passer à l'ordre de tout - OK/Annuler, etc.)

+0

Comment le faites-vous lorsque vous sélectionnez les éléments dans la zone de liste, qui est dans ce cas un élément, une liste déroulante s'affiche? Avoir des boîtes combo séparément comme je pensais? ou .. – baron

+0

Vous pouvez intégrer une zone de liste déroulante dans l'élément de zone de liste. Je ne sais pas comment, mais je l'ai vu un certain nombre de fois. Ou pas vraiment intégré, mais créé en place sur le clic, puis détruit dès que vous en avez fini avec lui. Même avec 'édition en place' des champs - une boîte d'édition est intégrée et/ou est créée en place si nécessaire. C'est un idiome commun. Coller avec votre interface utilisateur originale est non standard, et je vais juste être source de confusion pour les utilisateurs, je crois. – tony

+0

J'ai tendance à être d'accord avec vous ... La prochaine étape, je vais devoir comprendre exactement comment faire cela. Bien que je pense que je vais rester avec les deux boîtes de liste séparées, donc je n'ai pas à vous soucier de modifier deux éléments à la fois (si vous obtenez ce que je veux dire). J'ai les listes de sélection programmées pour faire défiler la synchronisation - ainsi garder la relation claire n'est pas un problème. Merci pour vos idées à ce sujet! – baron

0

Que se passe-t-il lorsque vous ne voulez pas que la combobox être modifiable, vous gérez l'événement Enter en mettant l'accent ailleurs. Sans le tester, vous devrez peut-être faire de même avec l'événement Click (pas sûr si un clic se déclenche Enter).

De cette façon, le texte reste visible, mais l'utilisateur ne peut pas modifier le texte ou la sélection. Une fois que l'utilisateur a cliqué sur le bouton Modifier, désactivez le (s) gestionnaire (s).

0

Si vous voulez simplement rendre votre liste déroulante désactivée mais plus facile à lire, modifiez simplement une copie du modèle.

dans le mélange ...

Object -> Modifier le modèle -> Modifier une copie ...

Ensuite, trouver la section pour l'état désactivé et le changer pour regarder la façon dont vous le souhaitez.

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

Définissez ensuite les Opacité à quelque chose comme 0,9

0

Hé, u'r en utilisant WPF! Solution simple et précise: il suffit d'éditer votre modèle ComboBox dans le mélange et supprimer Trigger pour IsEnabled

Voilà comment:

  • Faites un clic droit de votre combobox dans le mélange
  • Sélectionnez Modifier le modèle> Modifier une copie
  • Give quel que soit le nom que vous aimez dans votre style. J'ai choisi "ComboBoxStyle1". Définissez ce style dans l'endroit le plus approprié. Je l'ai défini dans "Ce document> Fenêtre"
  • Maintenant, allez dans "Affichage> Affichage de document actif> Vue XAML" dans la barre de menu.
  • Maintenant, allez à la section

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

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

</Style>

  • Dans cette section, rechercher et supprimer la section suivante

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

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

</Trigger>

  • Enregistrer. Et aus izz bien ..!