【问题标题】:Lingering WPF Drop Shadow挥之不去的 WPF 投影
【发布时间】:2013-03-09 20:01:49
【问题描述】:

我有一个 StackPanel 的阴影样式。内容绑定到 ObservableCollection,每个项目都呈现为图像。当我从集合中删除最后一个项目时,阴影仍然存在,即使图像不再存在。这只发生在最后一项。

发生了什么事?如何确保阴影也被移除?

        <Style TargetType="StackPanel" x:Key="ShadowedStackPanel">
            <Setter Property="BitmapEffect">
                <Setter.Value>
                    <DropShadowBitmapEffect Color="Black" Direction="50" ShadowDepth="5" Opacity=".65" Softness="1"/>
                </Setter.Value>
            </Setter>
        </Style>


    <ItemsControl x:Name="TilesControl">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" Style="{StaticResource ShadowedStackPanel}" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Image Source="{Binding Path=ImageSource}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

代码隐藏基本上是:

public ObservableCollection<TileViewModel> Hand = new ObservableCollection<TileViewModel>();

TilesControl.ItemsSource = Hand;

// populate the collection here

var last = Hand.Last();

Hand.Remove( last );

这会留下挥之不去的阴影效果。

如果我删除集合中的任何其他早期项目,它会重新绘制一切正常。仅当我删除最后一项时才会发生这种情况。

如果我调整窗口大小,它会被重新绘制并修复……但无论出于何种原因,如果我不这样做,它就会留下挥之不去的阴影。

如何强制重绘以使阴影消失?还是一开始就避免这个问题?

【问题讨论】:

    标签: c# wpf rendering dropshadow


    【解决方案1】:

    你可以在删除后使用代码

    TilesControl.Items.Refresh();
    

    【讨论】:

    • 成功了,谢谢。我试图让控件本身刷新,但这不起作用,但调用 .Items.Refresh() 效果很好。
    • 是的。但是如果我使用 Button 控件而不是 Image,TilesControl 可以正常工作而无需任何技巧。我不知道用 Image 修复控件的其他方法。
    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 2011-03-27
    • 2012-10-20
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多