2010-10-11 22 views
39

Sto utilizzando un controllo Popup WPF e lo sfondo è nero. Inserisco uno StackPanel al suo interno con Sfondo = "Trasparente", ma ciò non aiuta.Interfaccia utente popup WPF nera

<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> 

Qualcuno può dirmi come rendere lo sfondo su Popup trasparente (o qualsiasi colore)?

+0

Si prega di inviare alcuni esempi di XAML. Quello che descrivi non è un comportamento predefinito, ma è difficile dire molto di più su di esso senza sapere come lo definisci. –

+0

@PN A parte - Se si aggiunge il codice, selezionare (evidenziare) e selezionare il pulsante "codice" sopra la casella di testo di modifica. Questo formatta il codice per essere molto più leggibile. –

+0

Cosa accade se si aggiunge il controllo CircularProgressBar direttamente a una finestra (come test). Lo sfondo nero potrebbe provenire da quello? –

risposta

64

è necessario impostare il AllowsTransparency="True" Popup proprietà su True

Ecco un esempio:

<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> 

e il gestore di click

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

Ciao Svetlozar: Ho provato questo ma non funziona. Per me però non ho uno StackPanel al di fuori del Popup, ma ho uno StackPanel all'interno del Popup che contiene un paio di controllo su di esso. –

+0

Questo funziona perfettamente, dovrebbe essere contrassegnato come una risposta. –

3

La mia ipotesi è che il CircularProgressBar è effettivamente causando lo sfondo nero. L'unico altro modo in cui ciò potrebbe accadere è se ci fosse uno stile o qualcosa impostato su uno dei controlli (Popup o StackPanel o ...).

Ecco un esempio quick-n-dirty che mostra un TextBlock in un popup quando viene selezionata una casella di controllo. I colori scelti sono solo per assicurarsi che le cose si distinguono visivamente:

<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> 

Così, due test si può fare per determinare che cosa sta accadendo:

  1. Sostituire il CircularProgressBar con un semplice TextBlock o un altro controllo che non hai uno stile applicato a
  2. Inserisci CircularProgressBar come controllo autonomo da qualche parte nella finestra o in una finestra di test altrimenti vuota.
0

Il problema è che la griglia non è l'orientamento lo pone all'esterno del popup. Rimuovere VerticalAlignment e horizontalAlignment da tutti i controlli all'interno del pop-up, e funzionerà correttamente

1

Secondo questo articolo Why is my WPF Popup black and how do I get it positioned properly? :
È necessario impostare la proprietà AllowsTransparency sul Popup su True, e impostare il PlacementTarget e Placement proprietà di controllare la posizione un'altra si apre in

Come per il codice in questione:.

<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> 

il PlacementTarget è impostato parentStackPanel, mentre l'interrogante ha menzionato:

Ciao Svetlozar: Ho provato questo ma lo fa non funziona. Per me però io non hanno uno StackPanel di fuori il Popup, ma ho avere uno StackPanel all'interno del Popup che contiene un paio di controllo su di esso

Il problema potrebbe essere che Popup potrebbe non trovare the PlacementTarget 'parentStackPanel' perché non esiste.

10

Il colore di base di Popup o Window è di colore nero. Lo si vede raramente per Window perché Window ha una proprietà Background e il valore predefinito è un colore a tinta unita, ma se si imposta Window.Background su Transparent sarà anche nero. Ma Popup non ha una proprietà Background e quindi, scusate il gioco di parole, questo problema "si apre".

Se si desidera che lo Popup sia trasparente, è necessario impostare AllowsTransparency="True". Tuttavia, se vuoi che il Popup sia un colore a tinta unita, l'approccio più semplice è rendere il figlio di Popup un Panel che supporti la proprietà Background e impostare quella proprietà sul colore desiderato, quindi impostare il figlio di Panel in modo che sia il contenuto che intendi per lo Popup in primo luogo. Suggerisco Grid in quanto non influenzerà il layout del tuo Popup. L'unico effetto sarà quello di darti il ​​colore di sfondo che desideri.

8

Assicurarsi che l'opzione Consenti trasparenza sia impostata su true, che gli allineamenti verticali e orizzontali siano centrati e che altezza e larghezza siano impostati su Auto.

Ad esempio:

<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> 
0

abbastanza vecchio, ma possono aiutare qualcuno: Aggiungi InitializeComponent(); nel costruttore, ha risolto il mio problema:

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

Downvote ... Perché non mi piace questa risposta ... È solo così ... Wrong ... – WoIIe

+0

@WoIIe, grazie per il feedback. Sarei felice di sapere qual è il mio errore. Ha funzionato per me, quindi cosa mi manca? – Tar

+0

Mi dispiace per aver scritto un commento così scortese. Non penso che la tua risposta possa aiutare l'OP in alcun modo a risolvere il suo problema. Una ragione è che 'InitializeComponent()' -Method viene generato automaticamente nel costruttore e totalmente necessario per un 'Control' o' FrameWorkelement' per funzionare in un'app WPF. Non c'è assolutamente alcun motivo per cancellare questa linea. Hai anche un codice scritto, che mostra un'implementazione personalizzata del controllo 'Popup', che non è il caso dell'OP. Dato che usa la normale classe 'Popup', non c'è modo che abbia dimenticato il metodo' this.InializeComponent() 'per il suo Popup. – WoIIe

1

Un'altra possibile causa:

  • utilizzando IsOpen = "True" nel markup prima di AllowTransparency = "True"

Cambiare l'ordine lo risolve.