2014-06-23 5 views
3

Est-il possible de détecter le placement final d'une fenêtre contextuelle? J'ai un popup personnalisé qui rend en dessous d'un élément d'interface utilisateur spécifié et je voudrais qu'il dessine une bordure par rapport à sa position au contrôle d'interface utilisateur spécifié. Par défaut, le comportement est correct, de sorte que la fenêtre contextuelle est dessinée sous le contrôle.
Cependant, selon le comportement de la fenêtre contextuelle, si elle rencontre un bord d'écran, la pop est dessinée à un emplacement différent. Ma question est là pour détecter si les popups sont enfin positionnés puis dessiner les bordures respectives de son nouvel emplacement.
Ou cela nécessite-t-il un processus manuel pour fonctionner si le popup a été dessiné dans un emplacement différent de son emplacement par défaut.WPF Détection du placement final de Popup

EDIT
Ci-dessous une image de Git extensions que vous voyez qu'il n'y a pas de ligne seperating « dev » du reste de la liste déroulante. Maintenant, j'ai été capable de reproduire ce comportement tout heureux. Cependant, les popups ont cette caractéristique intéressante où si le bord de l'écran rencontre le popup accordingly, ce n'est pas mon problème, car quand le popup est décalé ou rendu à un autre point, je dois prendre ce shift et dessiner les popups de manière appropriée. c'est-à-dire que si cette option de sélection est affichée au-dessus du bouton de dev le haut du popup aura une ligne complète et le bas aura l'écart approprié (désolé pas d'exemple d'image). Quand j'ai l'occasion, je vais dessiner un exemple.

J'espère que l'édition aide :)

enter image description here

+0

Je suis sûr que l'utilisation d'un événement dans [Popup] (http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.popup(v=vs.110).aspx) et en vérifiant la propriété 'Placement' vous obtiendriez ce que vous êtes à la recherche de. – Kcvin

+0

J'ai essayé l'événement Ouvert mais l'emplacement est toujours défini sur Bas même s'il est rendu au-dessus du contrôle. – Heinrich

+0

pourriez-vous partager un écran de ce que vous essayez d'atteindre? – pushpraj

Répondre

1

On dirait que vous essayez de créer bordure autour de la fenêtre contextuelle

Voici un exemple

<Grid> 
    <ToggleButton Content="open popup" 
        x:Name="toggle" 
        HorizontalAlignment="Center" 
        VerticalAlignment="Center" /> 
    <Popup PlacementTarget="{Binding ElementName=toggle}" 
      IsOpen="{Binding IsChecked,ElementName=toggle}" 
      AllowsTransparency="True"> 
     <Border Background="White" 
       CornerRadius="4" 
       BorderBrush="Black" 
       BorderThickness="1" 
       Padding="5" 
       Margin="0,0,10,10"> 
      <StackPanel> 
       <Button Content="somebutton" /> 
       <RadioButton Content="a radiobutton" /> 
       <CheckBox Content="a checkbox" /> 
      </StackPanel> 
      <Border.Effect> 
       <DropShadowEffect Opacity=".25" /> 
      </Border.Effect> 
     </Border> 
    </Popup> 
</Grid> 

en utilisant cette approche, vous Sera capable de dessiner la frontière ou l'ombre même si une partie de la fenêtre est hors de la limite de l'application

résultat

popup

vous pouvez envelopper la frontière et ou l'ombre dans un style réutilisable pour réutilisabilité

EDIT

J'ai essayé de correspondre à vos besoins, également créé un gabarit réutilisable pour le même

<Grid RenderOptions.EdgeMode="Aliased"> 
    <Grid.Resources> 
     <ControlTemplate TargetType="HeaderedContentControl" 
         x:Key="PopupButton"> 
      <Grid> 
       <ToggleButton Content="{TemplateBinding Header}" 
           x:Name="toggle" 
           HorizontalAlignment="Center" 
           VerticalAlignment="Center"> 
        <ToggleButton.Template> 
         <ControlTemplate TargetType="ToggleButton"> 
          <Border BorderBrush="Gray" 
            Background="White" 
            BorderThickness="1" 
            Padding="4" 
            x:Name="border"> 
           <StackPanel Orientation="Horizontal"> 
            <ContentPresenter /> 
            <TextBlock Text="▼" 
               Margin="4,0,0,0" 
               FontSize="8" 
               VerticalAlignment="Center" /> 
           </StackPanel> 
          </Border> 
          <ControlTemplate.Triggers> 
           <Trigger Property="IsChecked" 
             Value="True"> 
            <Setter Property="BorderThickness" 
              TargetName="border" 
              Value="1,1,1,0" /> 
           </Trigger> 
          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </ToggleButton.Template> 
       </ToggleButton> 
       <Popup PlacementTarget="{Binding ElementName=toggle}" 
         IsOpen="{Binding IsChecked,ElementName=toggle}" 
         AllowsTransparency="True"> 
        <Grid> 
         <Border Background="White" 
           BorderBrush="Gray" 
           BorderThickness="1" 
           Padding="5" 
           Margin="0,0,5,5"> 
          <ContentPresenter /> 
          <Border.Effect> 
           <DropShadowEffect Opacity=".25" /> 
          </Border.Effect> 
         </Border> 
         <Rectangle Fill="White" 
            Stroke="Transparent" 
            StrokeThickness="1" 
            Width="{Binding ActualWidth,ElementName=toggle}" 
            Height="3" 
            Margin=".5,-1,0,0" 
            HorizontalAlignment="Left" 
            VerticalAlignment="Top" /> 
        </Grid> 
       </Popup> 
      </Grid> 
     </ControlTemplate> 
    </Grid.Resources> 
    <HeaderedContentControl Header="dev" 
          Template="{StaticResource PopupButton}"> 
     <StackPanel> 
      <Button Content="somebutton" /> 
      <RadioButton Content="a radiobutton" /> 
      <CheckBox Content="a checkbox" /> 
     </StackPanel> 
    </HeaderedContentControl> 
</Grid> 

vous pouvez définir le modèle dans vos ressources et modèle dans votre application pour plusieurs articles

par exemple

<HeaderedContentControl Header="header" 
          Template="{StaticResource PopupButton}"> 
     <!--popup content here--> 
    </HeaderedContentControl> 

résultat

result

+0

Ah oui la frontière est l'idée mais le problème est de s'assurer qu'il n'y a pas de ligne de séparation entre le popup et le bouton. Jetez un oeil à la modification, espérons-le, il aide à expliquer un peu plus :) – Heinrich

+0

Cela semble bon. Mais si vous déplacez la fenêtre, la fenêtre ne bouge pas. Une idée pour ce défi? – Christoph

+0

@Christoph, ce comportement est attendu avec des popups. Le moyen le plus simple est de fermer la popup une fois que la fenêtre reçoit le clic etc. Une autre option serait de synchroniser la position de la fenêtre popup avec la fenêtre principale. N'hésitez pas à créer une nouvelle question pour la même chose. – pushpraj