سؤال

لقد طورت تطبيقًا لالتقاط الصور وحفظها في قاعدة بيانات ، لكنني أواجه مشكلة مع استخدام الذاكرة. في كائن المجال الخاص بي ، لدي 3 خصائص:

الصورة - صفيف البايت ، المحتويات هي JPG

RealimageThumb - تم تحويل صفيف البايت إلى نقطية وتقلصت ، معروضة للمستخدم في شبكية مع صورة مصغرة أخرى

Realimage - لا يوجد لديه setter ، صفيف البايت الذي تم تحويله إلى مصدر نقطية ، ويظهر هذا في مجموعة الأدوات عندما يحوم المستخدم فوقه.

المشكلة التي لدي هي أنه إذا كان المستخدم يحوم فوق كل صورة بدوره لقواعد استخدام الذاكرة. أدرك أنه عندما يحوم المستخدم على مصادر نقطية ، ولم يتم تحرير الذاكرة ، فقد حاولت إعطاء عقار دعم وتخصيص هذا فارغًا بعد ذلك ولكن مرة أخرى لم يتم تحرير الذاكرة (في انتظار القمامة جامع؟).

تعديل:

هل هذا ما قصدته راي؟ لا أحصل على أي شيء مبين في تلميح الأدوات على النحو التالي ، ولكن إذا حاولت تحديد أ WeakReference<BitmapImage>, ، أحصل على System.WeakReference ليس لديه خطأ معلمات النوع.

  private WeakReference _realImage;
        public virtual BitmapImage RealImage
        {
            get
            {
                if (_realImage == null || _realImage.Target == null)
                {

                    if (Image == null) return null;
                    var newBitmapImage = new BitmapImage();
                    newBitmapImage.BeginInit();
                    newBitmapImage.CacheOption = BitmapCacheOption.None;
                    newBitmapImage.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
                    newBitmapImage.StreamSource = new MemoryStream(Image);
                    newBitmapImage.EndInit();
                    _realImage = new WeakReference(newBitmapImage);
                }

                return (BitmapImage)_realImage.Target;
            }
        }
هل كانت مفيدة؟

المحلول

ستحتاج إلى القيام بثلاثة أشياء:

  1. عند بناء صورة نقطية ، استخدم StreamSource لتزويد البيانات. لا تستخدم Urisource أو تمرير URI إلى المُنشئ ، مما قد يتسبب في إضافة الصورة إلى ذاكرة التخزين المؤقت للصورة.

  2. في تطبيق Compoing الخاص بمجالك ، قم بتخزين مؤتمر ضعيف على Nitmapimage وليس النقطة المعتاد نفسها. عندما يتم إحضار Realimage ، إذا كان إما ضعيفًا أو ضعيفًا. المستهدف فارغًا ، قم بإنشاء نقطية جديدة وضعف جديد لذلك.

  3. استخدم datatrigger مع تبديل القالب لتضمين فقط التحكم في الصور في الشجرة المرئية عندما تكون مرئية

فيما يلي القوالب اللازمة للخطوة 3 ، بما في ذلك تلك التي تحتوي على Datatrigger:

<DataTemplate x:Key="EmptyTemplate">
</DataTemplate>

<DataTemplate x:Key="RealImageTemplate">
  <Image Source="{Binding RealImage.Target}" Width="300" Height="300" />
</DataTemplate>

<DataTemplate x:Key="RealImageWhenVisible">

  <!-- Use EmptyTemplate when I am not visible -->
  <ContentPresenter x:Name="Presenter"
                    Content="{Binding}"
                    ContentTemplate="{StaticResource EmptyTemplate}"/>

  <!-- Switch to RealImageTemplate when I am visible -->
  <DataTemplate.Triggers>
    <DataTrigger Binding="{Binding IsVisible, RelativeSource={RelativeSource Self}}"
                 Value="True">
      <Setter TargetName="Presenter"
              Property="ContentPresenter.ContentTemplate"
              Value="{StaticResource RealImageTemplate}" />
    </DataTrigger>
  </DataTemplate.Triggers>
</DataTemplate>

الآن يمكنك تحديد تلميح الأدوات الخاص بك مثل هذا:

<Rectangle Width="40" Height="40" Fill="Blue">
  <Rectangle.ToolTip>
    <ContentPresenter Content="{Binding}"
                      ContentTemplate="{StaticResource RealImageWhenVisible}" />
  </Rectangle.ToolTip>
</Rectangle>

كيف تعمل: هناك نوعان من المحتوى داخل بعضهما البعض:

  • عندما يكون المحتوى الخارجي غير مرئي ، سيكون للمحتوى الداخلي praytemplate حتى لا يتم تحميل أي صورة.
  • عندما يكون المحتوى الخارجي مرئيًا ، سيكون للمحتوى الداخلي المحتوى الداخلي realimageTemplate بحيث يتم تحميل الصورة وعرضها.

السبب في أنك بحاجة إلى القيام بذلك هو أن تلميح الأدوات قد تحاول تحسين الأداء من خلال عدم التخلص من المنبثقة بمجرد عرضه.

تحديث

يجب أن تعمل الكود الذي نشرته لـ Realimage ، وهو ما كنت أفكر فيه تمامًا. لقد أدركت هذا الصباح أنه لا توجد حاجة حقًا لضبط BitmapCacheOption أو NitmapCreateOption طالما لم يتم تحديد Sourceuri. لقد قمت بتحديث إجابتي لتعكس هذا وأيضًا لتوضيح الشيء الضعيف. قمت أيضًا بتصحيح خطأ في القالب: كنت ملزماً بـ "Realimage" عندما كان ينبغي أن أكون ملزماً بـ "Realimage.target".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top