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)?
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;
}
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.
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>
Une autre cause possible:
Changer l'ordre corrige cela.
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:
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.
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();
/*
...
*/
}
/*
...
*/
}
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