2010-10-11 7 views
39

Estoy usando un control WPF Popup, y muestra el fondo como negro. Puse un StackPanel dentro con Background = "Transparent", pero eso no ayuda.IU emergente WPF que muestra negro

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

¿Puede alguien decirme cómo hacer que el fondo de Popup sea transparente (o de cualquier color)?

+0

Por favor, publique un ejemplo de XAML. Lo que describes no es un comportamiento predeterminado, pero es difícil decir mucho más al respecto sin saber cómo lo defines. –

+0

@PN Como comentario adicional: si agrega un código, selecciónelo (resalte) y seleccione el botón "código" sobre el cuadro de texto de edición. Esto formateará el código para que sea mucho más legible. –

+0

Qué sucede si agrega el control CircularProgressBar directamente a una ventana (como una prueba). ¿Podría el fondo Negro venir de eso? –

Respuesta

64

Es necesario configurar el AllowsTransparency="True" emergente propiedad a True

He aquí un ejemplo:

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

y el controlador de clic

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

Hola Svetlozar: Intenté esto pero no funciona. Para mí, aunque no tengo un StackPanel fuera del Popup, tengo un StackPanel dentro del Popup que tiene un par de controles sobre él. –

+0

Esto funciona perfectamente, debe marcarse como una respuesta. –

3

Mi conjetura es que el CircularProgressBar realmente está causando el fondo negro. La única otra forma en que esto podría suceder es si hubo un Estilo o algo configurado en uno de los controles (Popup o StackPanel o ...).

Aquí hay un ejemplo rápido y sucio que muestra un TextBlock en una ventana emergente cuando se marca una casilla de verificación. Los colores elegidos son sólo para asegurarse de que todo se destacan visualmente:

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

Así, dos pruebas que se pueden hacer para determinar lo que está sucediendo:

  1. Sustituir el CircularProgressBar con un TextBlock sencilla u otro control que no tiene un Estilo aplicado.
  2. Coloque la CircularProgressBar como un control independiente en algún lugar de su ventana, o en una ventana de prueba que de lo contrario estaría en blanco.
0

El problema es que la cuadrícula no tiene orientación lo coloca fuera de la ventana emergente. Retire VerticalAlignment y horizontalAlignment de todos los controles dentro de la ventana emergente, y funcionará correctamente

1

Según este artículo Why is my WPF Popup black and how do I get it positioned properly? :
Es necesario establecer la propiedad AllowsTransparency en la ventana emergente en True, y establecer el PlacementTarget y Colocación propiedades para controlar la posición de la emergente se abre en

de acuerdo con el código en cuestión:.

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

la PlacementTarget se establece en parentStackPanel, mientras el interrogador ha mencionado:

Hola Svetlozar: He intentado esto pero no funciona . Para mí, sin embargo me hacer no tener StackPanel fuera la ventana emergente, pero tener un StackPanel dentro del emergente que tiene un par de Control en él

El problema podría ser que Emergente podía no encuentre PlacementTarget 'parentStackPanel' porque no existe.

10

El color base de Popup, o Window para el caso, es negro. Rara vez lo ve para un Window porque Window tiene una propiedad Background y su valor predeterminado es un color sólido, pero si establece Window.Background en , también será negro. Pero Popup no tiene una propiedad Background y, por lo tanto, perdón por el juego de palabras, este problema "aparece".

Si desea que el Popup sea transparente, debe configurar AllowsTransparency="True". Sin embargo, si desea que el Popup sea un color sólido, el enfoque más simple es hacer que el hijo del Popup sea un Panel que admita la propiedad Background y establecer esa propiedad según el color que desee y luego configurar el hijo del Panel para que sea el contenido que pretendía para el Popup en primer lugar. Sugiero Grid ya que no afectará el diseño de su Popup. Su único efecto será darle el color de fondo que desee.

8

Asegúrese de que la transparencia de permiso esté establecida en verdadero, las alineaciones vertical y horizontal estén centradas, y la altura y el ancho estén establecidos en Automático.

Por ejemplo:

<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

bastante antiguo, pero puede ayudar a alguien: Añadir InitializeComponent(); en el constructor, se resolvió mi problema:

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

Voto abajo ... Porque no me gusta esta respuesta ... Es tan ... Incorrecto ... – WoIIe

+0

@WoIIe, gracias por los comentarios. Me gustaría saber cuál es mi error. Funcionó para mí, entonces, ¿qué extraño? – Tar

+0

Lo siento por escribir un comentario tan grosero. Simplemente no creo que su respuesta pueda ayudar al OP de ninguna manera para resolver su problema. Una razón es que 'InitializeComponent()' -Método se autogenera en el constructor y es totalmente necesario para que 'Control' o' FrameWorkelement' funcionen en una aplicación WPF. No hay absolutamente ninguna razón para eliminar esta línea. También tiene un código escrito que muestra una implementación personalizada del control 'Popup', que no es el caso para el OP. Como usa la clase normal 'Popup', no hay forma de que olvidara el método' this.InializeComponent() 'para su Popup. – WoIIe

1

Otra posible causa:

  • utilizando IsOpen = "True" en el marcado antes de AllowTransparency = "True"

Cambiar el orden lo soluciona.

Cuestiones relacionadas