私のアプリについての簡単な説明:
私が取り組んでいるアプリケーションは、グリーティング カード デザイナーです。背景画像があり、背景の上にとどまり、移動、サイズ変更、前後に移動できる無数の「レイヤー」(特に写真)があるものを想像してみてください...
星や楕円などの特定の形状をこれらのレイヤーに適用することも可能です..カードが作成された後、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 にあるはずです。
私は何か間違ったことをしていますか?それとも、既知の問題がありますか? 同じことを別の方法で行う方法はありますか (画像に図形を適用する..)?
ありがとう。