DropShadowEffect应用于子元素 - Silverlight XAML

时间:2011-08-02 21:23:35

标签: silverlight xaml dropshadow

我有一个ItemsControl,其中包含一些嵌套容器。我想在主要ItemsControl的每个元素周围添加一个drophadow。但是它将它添加到主要ItemsControl中的某些容器中(创建阴影行)。我已经将效果放在了许多不同的级别,但结果没有变化。我从主ItemsControl中的项目的最外层容器开始,然后从那里向上移动。

这是我目前对放置阴影的效果:

<ItemsControl  >
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <!-- I have tried adding the dropshadow effect within this stackpanel -->
            <StackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <!-- Where I define the dropshadow -->
    <ItemsControl.Effect>
        <DropShadowEffect BlurRadius="0" ShadowDepth="1" Color="LightGray"/>
    </ItemsControl.Effect>
    <!-- End of dropshadow definition -->    

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <media:Step5Item />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这里是Step5Item的定义,我添加了阴影出现位置的文档:(编辑)我删除了元素的内容,因为那只是造型等等。

<!-- This is inserted by the above code's DataTemplate -->
<!-- I have tried adding a border here and giving it a dropshadow effect -->
<Grid >

    <!-- I have tried inserting a dropshadow effect here -->

    <TextBlock Grid.Row="0"/>

    <Border BorderBrush="LightGray" BorderThickness="1" >
        <!-- I have tried inserting a dropshadow effect here -->
        <Grid>
            <Border >
                <!-- There is a shadow around this border/grid -->
                <Grid Grid.Row="0" >
                    <TextBlock Grid.Column="0" />
                    <Button Grid.Column="2"/>

                </Grid>
            </Border>

            <!--There is a shadow around each element in this ItemsControl-->
            <ItemsControl Grid.Row="2" >
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid Margin="0,0,0,4" >
                            <Path Grid.Row="0">
                                <Path.Data>
                                    <LineGeometry StartPoint="0,0" EndPoint="1500,0"/>
                                </Path.Data>
                            </Path>
                            <Grid Grid.Row="1">
                                <Image Grid.Column="0" />
                            </Grid>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>
    </Border>
</Grid>

底部还有一个阴影,但我不知道它是来自ItemsControl中的最后一个元素,还是来自最外边框。

如果您愿意,我可以更多地清理第二个代码。我拿出一些东西,但留在元素中,认为这可能是最好的可读性。

修改 我尝试在添加子元素后尝试应用效果,因为它们会在效果发挥之前创建,因为它不会发生问题。我尝试将效果放在主要ItemsControl的底部以及Step5Item中最外层网格的底部。我还从Step5Item中删除了一些内容,以使其更具可读性。

EDIT2

这是两张有效和无效的图像。我把DropShadow代码保留在我放在上面的位置,尽管我说过,我可以把它放在很多地方以达到同样的效果。

使用Dropshadow

With Error http://img811.imageshack.us/img811/2168/dropshadowerror.png

没有Dropshadow

Without Error http://img402.imageshack.us/img402/1456/nodropshadowexample.png

编辑3

这是我从Erno的解决方案中使用的边框和阴影效果。我希望能够更多地增加阴影深度,因为右侧没有任何阴影,只有底部。目前,如果我更改了ShadowDepth,它将更改为阴影的位置,使其距离等于新大小,但厚度仅为1。

<Border Margin="0,1,0,0" Height="auto" Width="auto" CornerRadius="5,5,5,5"    BorderThickness="1" BorderBrush="LightGray">
    <Border.Effect>
        <DropShadowEffect BlurRadius="0" ShadowDepth="1" Direction="315" Color="LightGray"/>
    </Border.Effect>
</Border>

1 个答案:

答案 0 :(得分:2)

您是否尝试过以下操作?

我添加了另一个Grid,并添加了一个具有效果的SIBLING边框。包含行的网格显示在其顶部,但不是边框的子控件。

        <ItemsControl Grid.Row="2" >
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="0,0,0,4" >

                        <Grid> 
                            <Border>
                                <Border.Effect>
                                    <DropShadow />
                                </Border.Effect>
                            </Border>

                            <Path Grid.Row="0">
                                <Path.Data>
                                    <LineGeometry StartPoint="0,0" EndPoint="1500,0"/>
                                </Path.Data>
                            </Path>
                            <Grid Grid.Row="1">
                                <Image Grid.Column="0" />
                            </Grid>
                        </Grid>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>