WPF DropShadow消失了

时间:2010-02-22 23:02:37

标签: wpf dropshadow

Wpf的阴影消失了。 以下是如何重现。

在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 pad窗口的大小,以便您可以看到边界。在我的机器上,投影现在消失了。

其他人都看到了吗?请帮忙。

1 个答案:

答案 0 :(得分:2)

我希望我能给你一个很好的解释,但是你的XAML中有一些奇怪的东西我玩了,我想我有一个解决方案。

  1. 如果使用网格,则很可能需要布置特定数量的行和列。你应该指定那些。但是,这不会影响您的问题。
  2. 同样,您应该为元素指定行和列,因为您最终还是需要将此信息放入XAML中。从IMO开始是一个好习惯。
  3. 我无法解释的问题是Horizo​​ntalAlignment和VerticalAlignment的组合。当你把Button放在网格中时,我希望Button占据整个空间,但事实并非如此。只要我能指出,唯一可以使这项工作的方法是指定高度宽度。如果这样做,效果将起作用。我发现原始XML中的阈值是总Y值为239.例如,如果使用0,239,0,0,则会失败。如果您使用0,139,0,100,它也会失败,因为总和是239.奇怪的东西。
  4. 这是我的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>
    

    编辑 OP不想指定Button的大小,因为Button的内容可以动态更改。事实证明,如果你将MinHeight设置为18(我觉得这对大多数内容来说都是合理的),那么Drophadow效果会再次起作用。

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