WPF DropShadow исчезает - PullRequest
       6

WPF DropShadow исчезает

2 голосов
/ 23 февраля 2010

Wpf Dropsadow исчезает. Вот как воспроизвести.

Введите следующее в xaml pad.

<Page.Resources>
    <DropShadowEffect x:Key="shadow"
        Opacity="1"
        ShadowDepth="1"
        Color="Blue"
        BlurRadius="30"/>
</Page.Resources>
<Grid>
    <Button  HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,0,0,0">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border x:Name="Bd"
                                    BorderBrush="Black" BorderThickness="1"
                                    Background="Yellow"
                                    CornerRadius="8"
                                    Effect="{StaticResource shadow}">
                                <TextBlock Text="Hello out there"  HorizontalAlignment="Center" VerticalAlignment="Center"  />
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Button.Style>
    </Button>
</Grid>

Вы должны увидеть текст с рамкой вокруг него и тенью вокруг границы.

Теперь измените Margin = "0,0,0,0" на Margin = "0,300,0,0" и измените размер окна панели xaml, чтобы вы могли видеть границы. На моей машине тень исчезла.

Кто-нибудь еще видел это? Пожалуйста, помогите.

1 Ответ

2 голосов
/ 23 февраля 2010

Хотелось бы, чтобы у меня было хорошее объяснение для вас, но в вашем XAML были некоторые странные вещи, с которыми я играл, и я думаю, что у меня есть решение для вас.

  1. Если вы используете Grid, скорее всего, вы хотите разместить определенное количество строк и столбцов. Вы должны указать это. Однако это не влияет на вашу проблему.
  2. Аналогично, вы должны указать строку и столбец для вашего элемента, потому что вам все равно придется в любом случае поместить эту информацию в ваш XAML. Хорошая привычка начинать с ИМО.
  3. Проблема, которую я не могу объяснить, связана с комбинацией HorizontalAlignment и VerticalAlignment. Когда вы помещаете кнопку в сетку, я ожидаю, что кнопка займет все пространство, но это не так. Насколько я понял, единственный способ сделать эту работу - указать Высота и Ширина . Если вы сделаете это, эффект будет работать. Я обнаружил, что пороговое значение в вашем исходном XML-файле составляло общую маржу Y, равную 239. Например, если вы использовали 0,239,0,0, он потерпит неудачу. Если бы вы использовали 0,139,0100, он также потерпел бы неудачу, потому что сумма равна 239. Странные вещи.

Вот мой XAML, который работает:

<Page.Resources>
    <DropShadowEffect x:Key="shadow"
        Opacity="1"
        ShadowDepth="2"
        Color="Blue"
        BlurRadius="30"/>
</Page.Resources>
<Grid Width="Auto" Height="Auto">
  <Grid.RowDefinitions>
    <RowDefinition></RowDefinition>
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition></ColumnDefinition>
  </Grid.ColumnDefinitions>
    <Button Width="90" Height="30" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,300,0,0" Grid.Row="0" Grid.Column="0">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border x:Name="Bd"
                                    BorderBrush="Black" BorderThickness="1"
                                    Background="Yellow"
                                    CornerRadius="8"
                                    Effect="{StaticResource shadow}">
                                <TextBlock Text="Hello out there"  HorizontalAlignment="Center" VerticalAlignment="Center"  />
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Button.Style>
    </Button>

РЕДАКТИРОВАТЬ ОП не хочет указывать размер для кнопки, поскольку содержимое кнопки может динамически изменяться. Оказывается, если вы установите MinHeight примерно на 18 (я думаю, что это разумно для большинства контента), эффект дропшоу будет работать снова.

<Border x:Name="Bd" BorderBrush="Black" BorderThickness="1" Background="Yellow" CornerRadius="8" Effect="{StaticResource shadow}" MinHeight="18">
  <StackPanel Orientation="Vertical">
    <TextBlock>hi</TextBlock>
    <TextBlock>there</TextBlock>
  </StackPanel>
</Border>
...