1

私のアプリについての簡単な説明:

私が取り組んでいるアプリケーションは、グリーティング カード デザイナーです。背景画像があり、背景の上にとどまり、移動、サイズ変更、前後に移動できる無数の「レイヤー」(特に写真)があるものを想像してみてください...

星や楕円などの特定の形状をこれらのレイヤーに適用することも可能です..カードが作成された後、jpeg ファイルに保存することが可能です。

問題

すべて正常に動作しますが、シェイプをレイヤーに適用するとメモリ リークが発生することがわかりました。

各レイヤーの UserControl のコードは次のとおりです。

<UserControl>
.....
    <Grid x:Name="_myGrid"  >
        <Border x:Name="im_the_problem" BorderThickness="0" OpacityMask="{Binding Path=MyMask.Data, Converter={StaticResource MaskConverter}}">
        <!-- My Image... -->
        </Border>
    </Grid>
</UserControl>

ここで、MaskConverter コードは次のとおりです。

public class MaskConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter,
       System.Globalization.CultureInfo culture)
    {
        String maskData = value as String;
        if (maskData == null) 
            return null;
        if (maskData == "")
            return null;
        VisualBrush vb = new VisualBrush();
        vb.Visual = XamlReader.Parse(maskData) as Visual;
        return vb;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

パラメーター "MyMask.Data" は、さまざまな形状を含むテキスト ファイルから動的に読み込む XAMLパス(適用している形状) です。

したがって、原則として、*im_the_problem*という名前の境界線がある場合、メモリは解放されません。*im_the_problem*にコメントすると (つまり、図形のない長方形のレイヤー/画像だけが表示されます)、メモリ リークが発生することなく、すべてが魅力的に機能します。

問題は OpacityMask + VisualBrush にあるはずです。

私は何か間違ったことをしていますか?それとも、既知の問題がありますか? 同じことを別の方法で行う方法はありますか (画像に図形を適用する..)?

ありがとう。

4

3 に答える 3

0

VisualBrushをフリーズする必要があります;)

于 2012-02-21T14:54:18.847 に答える
0

MyMask.Data を実際の Path.Data にバインドし、Path.Fill を画像から作成された ImageBrush に設定することはできますか?

于 2011-07-27T17:15:09.180 に答える