web-dev-qa-db-fra.com

Interface utilisateur WPF Popup montrant le noir

J'utilise un contrôle WPF Popup, et il affiche l'arrière-plan en noir. J'ai mis un StackPanel à l'intérieur avec Background = "Transparent", mais cela n'aide pas.

<Popup PlacementTarget="{Binding ElementName=parentStackPanel}" Placement="Center"
        IsOpen="False" Name="m_popWaitNotifier" PopupAnimation="None" 
        AllowsTransparency="False">
    <StackPanel Orientation="Vertical" Background="Transparent">
        <uc:CircularProgressBar x:Name="CB" StartupDelay="0"
                                            RotationsPerMinute="20"
                                            Height="25" Foreground="White"
                                            Margin="12"/>
    </StackPanel>
</Popup>

Quelqu'un peut-il me dire comment rendre l'arrière-plan transparent (ou n'importe quelle couleur)?

51
P N

Vous devez définir le AllowsTransparency="True" Propriété contextuelle sur True

Voici un exemple:

<Grid>
    <StackPanel>
    <Button Click="Button_Click" Width="100" Height="20" Content="Click" />
        <Popup x:Name="popup" Width="100" Height="100" AllowsTransparency="True">
            <Grid Background="Transparent">
                <TextBlock Text="Some Text" />
            </Grid>
        </Popup>
    </StackPanel>
</Grid>

et le gestionnaire de clics

private void Button_Click(object sender, RoutedEventArgs e)
{
    popup.Visibility = System.Windows.Visibility.Visible;
    popup.IsOpen = true;
}
75
Svetlozar Angelov

La couleur de base d'un Popup, ou d'un Window d'ailleurs, est le noir. Vous le voyez rarement pour un Window parce que Window a une propriété Background et il a par défaut une couleur unie, mais si vous définissez Window.Background à Transparent il sera également noir. Mais Popup n'a pas de propriété Background et donc, pardonnez le jeu de mots, ce problème "apparaît".

Si vous souhaitez que le Popup soit transparent, vous devez définir AllowsTransparency="True". Cependant, si vous voulez que le Popup soit une couleur unie, l'approche la plus simple consiste à faire de l'enfant du Popup un Panel qui prend en charge le Background et définissez cette propriété à la couleur souhaitée, puis définissez l'enfant du Panel comme étant le contenu que vous vouliez pour le Popup en premier lieu. Je suggère Grid car cela n'affectera pas la disposition de votre Popup. Son seul effet sera de vous donner la couleur de fond que vous désirez.

13
Rick Sladkey

Assurez-vous que la transparence autorisée est définie sur vrai, que les alignements verticaux et horizontaux sont centrés et que la hauteur et la largeur sont définies sur Auto.

Par exemple:

<Popup Name="popup1" Placement="Top" PlacementTarget="{Binding ElementName=button2}" AllowsTransparency="True" Height="Auto" Width="Auto" Panel.ZIndex="1" HorizontalOffset="-5" HorizontalAlignment="Center" VerticalAlignment="Center">

<StackPanel Height="92" HorizontalAlignment="Left" Margin="93,522,0,0" Name="stackPanelPop" VerticalAlignment="Top" Width="147">
</StackPanel>

</Popup>
10
Zengineer

Une autre cause possible:

  • en utilisant IsOpen = "True" dans le balisage avant AllowTransparency = "True"

Changer l'ordre corrige cela.

4
Rob Relyea

Je suppose que CircularProgressBar est en fait à l'origine du fond noir. La seule autre manière que cela pourrait se produire est s'il y avait un style ou quelque chose défini sur l'un des contrôles (Popup ou StackPanel ou ...).

Voici un exemple quick-n-dirty qui montre un TextBlock dans une popup quand une case est cochée. Les couleurs choisies sont juste pour s'assurer que les choses se démarquent visuellement:

<StackPanel x:Name="stackPanelLayout">
    <StackPanel.Background>
        <RadialGradientBrush Center="0.75, 0.75"
                             SpreadMethod="Reflect">
            <GradientStop Color="LightBlue" Offset="0" />
            <GradientStop Color="SeaGreen" Offset="0.5" />
            <GradientStop Color="MidnightBlue" Offset="0.75" />
        </RadialGradientBrush>
    </StackPanel.Background>


    <CheckBox x:Name="chkShowPopup"
              FontSize="20"
              Foreground="White"
              Content="Show Popup" />

    <Popup PlacementTarget="{Binding ElementName=stackPanelLayout}" 
           Placement="Center" 
           IsOpen="{Binding ElementName=chkShowPopup, Path=IsChecked}" 
           Name="m_popWaitNotifier" 
           PopupAnimation="Slide"
           AllowsTransparency="True">
        <StackPanel Orientation="Vertical" Background="Transparent">
            <TextBlock Foreground="White" FontSize="30" FontWeight="Bold" Text="PopUp" />
        </StackPanel>
    </Popup>
</StackPanel>

Donc, deux tests que vous pouvez faire pour déterminer ce qui se passe:

  1. Remplacez CircularProgressBar par un simple TextBlock ou un autre contrôle auquel aucun style n'est appliqué.
  2. Placez le CircularProgressBar en tant que contrôle autonome quelque part sur votre fenêtre, ou sur une fenêtre de test autrement vide.
3
Wonko the Sane

Selon cet article Pourquoi mon WPF Popup est-il noir et comment le positionner correctement? :
Vous devez définir la propriété AllowsTransparency du Popup sur True et définir les propriétés PlacementTarget et Placement pour contrôler la position dans laquelle le Popup s'ouvre.

Selon le code en question:

<Popup PlacementTarget="{Binding ElementName=parentStackPanel}" Placement="Center" IsOpen="False" Name="m_popWaitNotifier" PopupAnimation="None" AllowsTransparency="False">
    <StackPanel Orientation="Vertical" Background="Transparent">
       <uc:CircularProgressBar x:Name="CB" StartupDelay="0" RotationsPerMinute="20" Height="25" Foreground="White" Margin="12"/>
    </StackPanel>
</Popup>

le PlacementTarget est défini sur parentStackPanel, alors que le questionneur a mentionné:

Salut Svetlozar: J'ai essayé mais ça ne marche pas. Pour moi, bien que je n'ai pas un StackPanel en dehors du Popup, mais J'ai un StackPanel dans le Popup qui détient un couple de contrôle dessus

Le problème pourrait être que Popup n'a pas pu trouver le PlacementTarget 'parentStackPanel' car il n'existe pas.

2
publicgk

Assez vieux, mais peut aider quelqu'un: Ajoutez InitializeComponent(); dans le constructeur, cela a résolu mon problème:

class MyPopupClass : Popup {
    /*
    ...
    */
    public MyPopupClass () {
        InitializeComponent();
        /*
        ...
        */
    }
    /*
    ...
    */
}
0
Tar

Le problème est que la grille n'est pas orientée la place en dehors de la popup. Supprimez VerticalAlignment et horizontalAlignment de tous les contrôles à l'intérieur de la fenêtre contextuelle, et cela fonctionnera correctement

0
Johnny DropTables