2010-10-11 2 views
39

Я использую элемент управления всплывающим окном WPF, и он показывает фон как черный. Я поставил StackPanel внутри него с Background = "Transparent", но это не помогает.WPF Popup UI, показывающий черный

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

Может кто-нибудь рассказать мне, как сделать фон на всплывающем прозрачном (или любом цвете)?

+0

Пожалуйста, отправьте пример XAML. То, что вы описываете, не является поведением по умолчанию, но трудно сказать об этом гораздо больше, не зная, как вы его определяете. –

+0

@PN В стороне. Если вы добавите код, выберите (выделите) его и выберите кнопку «code» над текстовым полем редактирования. Это позволит сделать код более читаемым. –

+0

Что произойдет, если вы добавите элемент CircularProgressBar непосредственно в окно (в качестве теста). Может ли черный фон исходить из этого? –

ответ

64

Вы должны установить AllowsTransparency="True" Контекстное свойство Истинных

Вот пример:

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

и обработчик щелчка

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

Hi Svetlozar: Я пробовал это, но он не работает. Для меня, хотя у меня нет StackPanel вне Popup, но у меня есть StackPanel в Popup, который содержит пару элементов управления. –

+0

Это прекрасно работает, должно быть отмечено как ответ. –

3

Я думаю, что CircularProgressBar фактически вызывает Черный фон. Единственный способ, которым это может случиться, - это создать стиль или что-то на одном из элементов управления (Popup или StackPanel или ...).

Вот пример быстрого n-грязного, который показывает всплывающее окно TextBlock, когда установлен флажок. Цвета, выбранные только чтобы убедиться, что выделяются визуально:

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

Таким образом, два теста вы можете сделать, чтобы определить, что происходит:

  1. Заменить CircularProgressBar с помощью простого TextBlock или другого элемента управления, у вас нет стиля.
  2. Установите CircularProgressBar как автономный элемент управления где-нибудь в вашем окне или в противном случае пустое тестовое окно.
0

Проблема в том, что сетка не является ориентацией, размещает ее вне всплывающего окна. Удалить VerticalAlignment и HorizontalAlignment из всех элементов управления внутри всплывающего окна, и он будет работать правильно

1

В соответствии с этой статьей Why is my WPF Popup black and how do I get it positioned properly? :
Вы должны установить свойство AllowsTransparency на всплывающем окне Правда, и установить PlacementTarget и размещение свойства для управления положением всплывающих открывается в

в соответствии с кодом в вопросе:.

<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 установлен в parentStackPanel, тогда как упомянутый вопросник:

Hi Svetlozar: Я пробовал это, но он не работает. Для меня, хотя я не имеют в StackPanel вне всплывающих, но я есть StackPanel в Popup , который держит пару управления на нем

Проблема может быть, что Всплывающие мог не найти PlacementTarget 'parentStackPanel', потому что его не существует.

10

Основной цвет Popup, или Window, в этом отношении, черный. Вы редко видите его для Window, потому что Window имеет свойство Background, и по умолчанию он имеет сплошной цвет, но если вы установите Window.Background на Transparent, он также будет черным. Но Popup не имеет собственности Background и поэтому, прошу прощения, эта проблема «всплывает».

Если вы хотите, чтобы Popup был прозрачным, вам необходимо установить AllowsTransparency="True". Однако, если вы хотите, чтобы Popup был сплошным цветом, самый простой способ - сделать дочерний элемент Popup a Panel, который поддерживает свойство Background, и установить это свойство в желаемый цвет, а затем установить дочерний элемент Panel контент, который вы намеревались для Popup. Я предлагаю Grid, так как это не повлияет на макет вашего Popup. Это будет только эффект, который даст вам цвет фона, который вы желаете.

8

Убедитесь, что разрешающая прозрачность установлена ​​в положение «Верно», вертикальное и горизонтальное выравнивание центрировано, а высота и ширина - «Авто».

Например:

<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

Довольно старый, но может помочь кому-то: Добавить InitializeComponent(); в конструкторе, это решить мою проблему:

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

Downvote ... Потому что мне не нравится этот ответ ... Это просто так ... Неправильно ... – WoIIe

+0

@WoIIe, спасибо за отзыв. Я был бы рад узнать, в чем моя ошибка. Это сработало для меня, так что я пропустил? – Tar

+0

Прошу прощения за то, что написал такой грубый комментарий. Я просто не думаю, что ваш ответ может помочь OP каким-либо образом решить его проблему. Одна из причин заключается в том, что 'InitializeComponent()' -Method автогенерируется в конструкторе и полностью необходим для 'Control' или' FrameWorkelement' для работы в приложении WPF. Нет абсолютно никакой причины удалять эту строку. Вы также написали код, который показывает пользовательскую реализацию 'Popup'-control, что не относится к OP. Поскольку он использует обычный класс «Popup», он не может забыть об этом методе this.InializeComponent() для своего всплывающего окна. – WoIIe

1

Другая возможная причина:

  • используя IsOpen = «True» в разметке до AllowTransparency = «True»

Переустановка заказа исправляет его.