2010-10-11 5 views
39

Używam formantu wyskakującego WPF, który pokazuje tło jako czarne. Umieściłem w nim StackPanel z Background = "Transparent", ale to nie pomaga.Wyskakujący interfejs WPF pokazujący czarny

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

Czy ktoś może mi powiedzieć jak zrobić tło na Popup przezroczyste (lub dowolny kolor)?

+0

Proszę podać przykład XAML. To, co opisujesz, nie jest domyślnym zachowaniem, ale trudno powiedzieć o nim więcej, nie wiedząc, jak to zdefiniujesz. –

+0

@PN Na marginesie - Jeśli dodasz kod, wybierz (podświetl) go i wybierz przycisk "kod" nad polem edycji. Spowoduje to sformatowanie kodu, aby był bardziej czytelny. –

+0

Co się stanie, jeśli dodasz kontrolkę CircularProgressBar bezpośrednio do okna (jako test). Czy z tego może pochodzić Czarne Tło? –

Odpowiedz

64

Musisz ustawić AllowsTransparency="True" Popup obiekt True

Oto przykład:

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

i obsługi click

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

Cześć Svetlozar: Próbowałem tego, ale to nie działa. Dla mnie jednak nie mam StackPanel poza Popup, ale mam StackPanel w Popup, który posiada kilka kontroli na nim. –

+0

To działa idealnie, powinno być oznaczone jako odpowiedź. –

3

Domyślam się, że CircularProgressBar jest rzeczywiście przyczyną czarne tło. Jedyny inny sposób, w jaki może się to zdarzyć, to sytuacja, w której styl lub coś jest ustawione na jednym z elementów sterujących (Popup lub StackPanel lub ...).

Oto przykład szybkiego i brudnego przykładu, który pokazuje blok tekstu w wyskakującym okienku po zaznaczeniu pola wyboru. Kolory dobrane są tak, aby upewnić się, że rzeczy wyróżniają się wizualnie:

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

Tak, dwa testy można zrobić, aby ustalić, co się dzieje:

  1. Wymień CircularProgressBar z prostym TextBlock lub innej kontroli, nie masz przypisanego stylu.
  2. Umieść CircularProgressBar jako samodzielną kontrolkę w oknie lub w innym pustym oknie testowym.
0

Problem polega na tym, że siatka nie jest orientacją, umieszcza ją poza oknem podręcznym. Usuń VerticalAlignment i horizontalAlignment ze wszystkimi kontrolkami wewnątrz popup, i będzie działać poprawnie

1

Zgodnie z tym artykułem Why is my WPF Popup black and how do I get it positioned properly? :
trzeba ustawić właściwość AllowsTransparency na Popup True, i ustawić PlacementTarget i rozmieszczenie właściwości kontrolować pozycję Popup otwiera w

według kodu w pytaniu.

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

PlacementTarget jest ustawiony na parentStackPanel, natomiast pytający wspomniał:

Witam Svetlozar: Próbowałem tego, ale nie działa . Dla mnie jednak ja nie mieć StackPanel poza Popup, ale Mam StackPanel w Popup która posiada kilka kontroli na nim

Problem może być, że Popup mógł nie znajduje się "parentStackPanel" PlacementTarget, ponieważ nie istnieje.

10

Podstawowy kolor oznaczenia Popup lub Window jest czarny. Rzadko zdarza się, aby uzyskać wartość Window, ponieważ Window ma właściwość Background i domyślnie przyjmuje kolor stały, ale jeśli ustawisz Window.Background na Transparent, będzie również czarny. Ale Popup nie ma własności Background, a więc, przepraszam, kalambur, ten problem "wyskakuje".

Jeśli chcesz, aby Popup był przezroczysty, musisz ustawić AllowsTransparency="True". Jeśli jednak chcesz, aby numer Popup był jednolity, najprościej podejść do tego, aby dziecko z Popup a Panel, które obsługuje właściwość Background i ustawić tę właściwość na pożądany kolor, a następnie ustawić dziecko z Panel treść, którą zamierzałeś dla Popup w pierwszej kolejności. Sugeruję Grid, ponieważ nie wpłynie to na układ twojego Popup. Efektem będzie tylko nadanie pożądanego koloru tła.

8

Upewnij się, że zezwolenie na przezroczystość jest ustawione na wartość true, wyrównania pionowe i poziome są wyśrodkowane, a wysokość i szerokość są ustawione na Auto.

Na przykład:

<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

dość stary, ale może komuś pomóc: Dodaj InitializeComponent(); w konstruktorze to rozwiązać mój problem:

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

Downvote ... Bo nie podoba mi się ta odpowiedź ... Tak jest po prostu ... Wrong ... – WoIIe

+0

@WoIIe, dzięki za informację zwrotną. Chętnie dowiem się, co jest moim błędem. To zadziałało dla mnie, więc o co mi chodzi? – Tar

+0

Przykro mi, że napisałem taki niegrzeczny komentarz. Po prostu nie sądzę, że twoja odpowiedź może pomóc OP w jakikolwiek sposób rozwiązać jego problem. Jednym z powodów jest to, że 'InitializeComponent()' -Method jest automatycznie generowany w konstruktorze i całkowicie niezbędny do działania 'Kontrolki' lub' FrameWorkelement' w aplikacji WPF. Nie ma absolutnie żadnego powodu, aby usunąć tę linię. Masz również napisany kod, który pokazuje niestandardową implementację 'Popup'-control, co nie ma miejsca w przypadku OP. Ponieważ używa normalnej klasy 'Popup', nie ma możliwości, aby zapomniał o' this.InializeComponent() '-metodzie jego Popup. – WoIIe

1

Inna możliwa przyczyna:

  • używanie IsOpen = "True" w znacznikach przed AllowTransparency = "True"

Zmiana kolejności rozwiązuje problem.