Comment puis-je empêcher un wpf J'imagine que la réponse a quelque chose à voir avec l'annulation d'un événement barbouillé. Si possible, je voudrais implémenter la solution dans XAML tout en évitant de replanifier l'ensemble de l'extenseur Expander Code>
de l'expansion lorsque son en-tête est cliqué? J'aimerais que mon Expander code> Pour développer ou s'effondrer uniquement lorsque le bouton Développer lui-même est cliqué. P>
code>. P>
7 Réponses :
L'en-tête est le bouton qui crée l'événement. Vous devez donc modifier le modèle de votre expandeur pour simplement avoir l'icône Expander comme bouton. P>
Voici un article de Comment changer l'expandeur . P>
J'ai modifié le modèle par défaut du contrôle code> extander code> comme suggéré par SIMEON.
Le Ceci est rapide et sale, alors attendez-vous à ce qu'elle casse. p> ControlTemplate CODE> Définit un extension, qui ne réagit que (expandes / effondre) lorsque L'utilisateur clique sur l'icône de l'en-tête. P>
Ma solution consistait à laisser l'en-tête vierge et simplement à étiqueter une commande qui agit comme en-tête (à l'aide d'une toile pour un positionnement absolu), que seule l'icône élargit la commande:
<Grid Height="{Binding ElementName=exp, Path=ActualHeight}"> <Canvas> <Expander Name="exp"> ... </Expander> <Control Style="{StaticResource ExpanderHeaderStyle}" Margin="20,0,0,0" /> </Canvas> </Grid>
Il y a en fait une solution XAML beaucoup plus simple que de modifier des modèles. N'utilisez simplement pas la propriété d'en-tête de l'expandeur dans ce cas. Au lieu de cela, couvrez l'expandeur avec votre propre textblock de style.
<Application.Resources> <Style x:Key="ExpanderHeader" TargetType="{x:Type TextBlock}"> <Setter Property="Height" Value="22" /> <Setter Property="Margin" Value="21,0,0,0" /> <Setter Property="Padding" Value="9,3,0,0" /> <Setter Property="HorizontalAlignment" Value="Stretch" /> <Setter Property="VerticalAlignment" Value="Top" /> </Style> </Application.Resources> <Grid> <Expander> <TextBlock Text="I am some content. I have disowned my default header." Margin="10,5" /> </Expander> <TextBlock Text="I'm filling in for the default header. You'll like me better anyway." Style="{StaticResource ResourceKey=ExpanderHeader}"/> </Grid>
C'est une réponse aussi brillante. Je l'ai testé et ça marche comme un charme. En l'utilisant dans ma propre application maintenant.
FYI, vous pourriez placer ce XAML dans un contrôle personnalisé qui peut être utilisé tout au long de votre projet.
Une solution assez simple consiste à modifier les modèles de boutons à bascule que le tempate de contrôle de l'expandeur utilise de la manière suivante.
Définissez le présentateur de contenu ishitterestvision à False P>
Vous pouvez simplement définir isenabled sur false mais au cas où vous auriez besoin de déterminer si vous pouvez développer ou effondrer lorsque l'en-tête est cliqué sur:
public class MyExpander : Expander { private bool CanExpand() => true; private bool CanCollapse() => true; private bool rollback; protected override void OnExpanded() { if (rollback) return; if (CanExpand()) { base.OnExpanded(); } else { rollback = true; SetCurrentValue(IsExpandedProperty, false); rollback = false; } } protected override void OnCollapsed() { if (rollback) return; if (CanCollapse()) { base.OnCollapsed(); } else { rollback = true; SetCurrentValue(IsExpandedProperty, true); rollback = false; } } }
Comme je viens de vérifier, l'en-tête est nommé "Headersite". Vous pouvez utiliser une méthode comme celle décrite dans ce message afin de trouver un enfant par nom. Lorsque vous avez l'enfant, vous pouvez simplement modifier la visibilité de cela. Assurez-vous également que l'expandeur est chargé, sinon vous ne verrez pas l'enfant.
expander.Loaded += (s, e) => { var hv = expander.findChildByName("HeaderSite"); if (hv == null) return; hv.Visibility = Visibility.Collapsed; };
Moi aussi! Qu'avez-vous fini par faire?
Je n'ai pas trouvé de solution et j'ai quitté l'expandeur tel quel.
La solution que j'ai utilisée consiste à placer un bouton à l'intérieur des balises, puis à modeler ce bouton de manière à ce qu'il n'ait pas de souris, cliquez sur Events et une valeur alpha de 1% (n ° 02000000), ce qui le rend essentiellement invisible mais cliquable. Il va ensuite manger l'en-tête d'expandeur cliquez sur l'événement.