Подтвердить что ты не робот

WPF Popup UI показывает черный

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

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

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

4b9b3361

Ответ 1

Вам нужно установить для свойства AllowsTransparency="True" всплывающее свойство значение 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;
}

Ответ 2

Базовый цвет Popup или Window, если на то пошло, черный. Вы редко видите его для Window, потому что Window имеет свойство Background, и по умолчанию он имеет сплошной цвет, но если вы установите Window.Background на Transparent, он также будет черным. Но Popup не имеет свойства Background, и поэтому, pardon pun, эта проблема "всплывает".

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

Ответ 3

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

Например:

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

Ответ 4

Я предполагаю, что 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>

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

  • Замените CircularProgressBar простым TextBlock или другим элементом управления, к которому у вас нет стиля.
  • Поместите CircularProgressBar как автономный элемент управления где-нибудь в вашем окне или в противном случае пустое тестовое окно.

Ответ 5

В соответствии с этой статьей Почему мой WPF Popup черный и как я его правильно позиционирую?:
Вам нужно установить свойство AllowsTransparency в Popup равным True и установить свойства PlacementTarget и Placement для управления позицией всплывающего окна.

В соответствии с рассматриваемым кодом:

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

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

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

Ответ 6

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

  • с использованием IsOpen = "True" в разметке до AllowTransparency = "True"

Переключение порядка исправляет его.

Ответ 7

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

Ответ 8

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

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