2015-10-07 1 views
2

Je veux placer une popup sous un bouton bascule quand je clique dessus. Dans cette fenêtre, je veux ajouter un bouton et d'autres contrôles. Mais comment puis-je m'assurer que la fenêtre popup sera toujours sous mon bouton bascule aussi quand je redimensionne ma fenêtre de mian.Comment toujours placer PopUp sous un ToggleButton dans WPF

Mon code XAML:

 <ToggleButton 
    x:Name="userBtn" 
    Margin="610,25,378,0" 
    VerticalAlignment="Top"    
    Height="29" 
    Grid.Column="2" 
    > 
     <ToggleButton.Resources> 
      <BitmapImage x:Key="imgNormal" UriSource="/Resources/home.jpg"/> 
      <BitmapImage x:Key="imgHover" UriSource="/Resources/home_checked.jpg"/> 
      <BitmapImage x:Key="imgChecked" UriSource="/Resources/home_checked.jpg"/> 
     </ToggleButton.Resources> 
     <ToggleButton.Style> 
      <Style TargetType="ToggleButton"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="ToggleButton" > 
          <StackPanel Orientation="Horizontal" VerticalAlignment="Top" Width="150" Height="32"> 
           <Image x:Name="PART_Image" Height="22" Width="22" RenderOptions.BitmapScalingMode="HighQuality" HorizontalAlignment="Center" Margin="0,0,0,0" Source="{StaticResource imgNormal}"/> 
           <TextBlock x:Name="PART_TEXT" FontFamily="Arial" Foreground="#FFAFADAD" FontSize="13" HorizontalAlignment="Center" Text="{x:Static properties:Resources.BtnDashboard}" Margin="10,9,0,0"></TextBlock> 
          </StackPanel> 
          <ControlTemplate.Triggers> 
           <Trigger Property="IsChecked" Value="true"> 
            <Setter TargetName="PART_Image" Property="Source" Value="{StaticResource imgChecked}"/> 
            <Setter TargetName="PART_TEXT" Property="Foreground" Value="#79B539" /> 
           </Trigger> 
           <Trigger Property="IsMouseOver" Value="true"> 
            <Setter TargetName="PART_Image" Property="Source" Value="{StaticResource imgHover}"/> 
            <Setter TargetName="PART_TEXT" Property="Foreground" Value="#79B539" /> 
           </Trigger> 
           <Trigger Property="IsEnabled" Value="false"> 
            <Setter TargetName="PART_Image" Property="Opacity" Value="0.6"/> 
           </Trigger> 
          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ToggleButton.Style> 
    </ToggleButton> 

    <Popup Name="UserMenuPopUp" PopupAnimation="Fade" Width="280" Height="auto" Margin="20" AllowsTransparency="True" HorizontalAlignment="Left" Placement="bottom" PlacementTarget="{Binding ElementName=userBtn}" IsOpen="{Binding IsChecked, ElementName=Userbtn}" StaysOpen="false" > 
     <Border Margin="2,0,48,0" BorderThickness="1" Background="#EEEEEE" Height="105"> 
      <Grid> 

      </Grid> 
     </Border> 
    </Popup> 

C# code pour un clic sur togglebutton:

private void UserBtn_Click(object sender, RoutedEventArgs e) 
    { 
     // Get location, adn sender 
     var element = (System.Windows.Controls.Primitives.ToggleButton)sender; 
     var location = element.PointToScreen(new Point(0, 0)); 

     // Set popup location 
     UserMenuPopUp.HorizontalOffset = (location.X); 
     UserMenuPopUp.VerticalOffset = (location.Y); 
     UserMenuPopUp.IsOpen = true; 
    } 

Répondre

4

Utilisez Placement et PlacementTarget propriétés du Popup :)

<Popup Placement="Bottom" PlacementTarget="{Binding ElementName=myToggleButton}" IsOpen="{Binding IsChecked, ElementName=Userbtn}" StaysOpen="False" /> 

La chose à noter voici, si la fenêtre est déplacée lorsque Popup est ouvert, il ne se déplace pas .. Ce que vous pouvez faire est de lier la propriété IsOpen à ToggleButtonIsChecked et définir StaysOpen = Faux. En faisant cela, le Popup se fermera automatiquement, en basculant le bouton :), vous n'aurez pas non plus besoin du code C# si vous devez le faire :)

OU voici un lien vers un autre article si cela doit rester ouvert quel que soit le cas soit: Move a WPF Popup

Hope it helps :)

+0

Merci pour votre réponse @ faztp12. Le popup est dans la bonne position, mais quand je bouge Fenêtres principales il ne suit pas :( –

+0

vérifier l'édition :) – faztp12

+0

Solution parfaite :) merci beaucoup. Mais sans le code C# ça ne marchera pas? –