سؤال

أنا أقوم بتطوير أ TreeView يستمر التحكم القائم على الحدث وحدث النقر المزدوج الخاص بي TreeViewItem العقد.

الهدف هو الحصول على TreeViewItem توسيع أو انهيار عند النقر المزدوج.

لدي نمط يطبق معالج الأحداث ل MouseDoubleClick حدث لكل TreeViewItem.

إليك الرمز الذي يتولى الحدث


private void TreeViewItemDoubleClicked( object sender, RoutedEventArgs e )
{
    // Get the specific tree view item that was double clicked
    TreeViewItem treeViewItem = sender as TreeViewItem;

    // not null?
    if( null != treeViewItem )
    {
         // Switch expanded state
         if( true == treeViewItem.IsExpanded )
         {
             treeViewItem.IsExpanded = false;
         }
         else
         {
             treeViewItem.IsExpanded = true;
         }

         // Set event handled
         e.Handled = true; // [1]
    }
}

هذا يعمل بشكل جيد للمستوى العلوي TreeViewItem ومع ذلك ، عندما يتم النقر المزدوج للطفل ، تقوم الحدث بفتحة الشجرة مما تسبب في انهيار الفرع بأكمله. لماذا يستمر الحدث في الفقاعة؟ كما لوحظ [1] أنا أقوم بإعداد الحدث على أنه معالجة.

هل كانت مفيدة؟

المحلول

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

بعد واجه بعض المصادر التي حددت أن mousedoubleclick يتم رفع لكل شجرة في الفرع (من الطفل إلى الجذر) بغض النظر عما إذا تم التعامل مع الحدث ، استخدمت الإجابة من هذا السؤال:

WPF Treeview ، Get TreeViewItem في حدث المعاينة

للحصول على TreeViewItem الذي كان تحت حدث الماوس. إذا كان المرسل الحالي مساوياً لـ TreeViewItem لحدث الماوس ، فأنا أوسع/انهيار كما هو مطلوب. خلاف ذلك ، أنا فقط أتجاهل الحدث ولا أفعل شيئًا.

نصائح أخرى

لا فكرة عن السبب ، لكن الإجابة المحددة لم تنجح في كل شيء TreeViewItems لي. لذلك استخدمت بسيطة bool النهج إلى السياج من reeintering TreeViewItemDoubleClicked أكثر من مرة.

private void TreeViewItemDoubleClicked( object sender, RoutedEventArgs e )
{
    // Make sure the event has never been handled first
    if (bubblingBulkwark)
        return;

    // Get the specific tree view item that was double clicked
    TreeViewItem treeViewItem = sender as TreeViewItem;

    // not null?
    if( null != treeViewItem )
    {
         // Switch expanded state
         if( true == treeViewItem.IsExpanded )
         {
             treeViewItem.IsExpanded = false;
         }
         else
         {
             treeViewItem.IsExpanded = true;
         }

         // Raise bulkwark
         bubblingBulkwark = true;
    }
}

للسماح للمعالج الأول الذي تم استدعاؤه بالتنفيذ بالكامل (وبالتالي الاعتماد على حقيقة أن معالج الطفل سيتم استدعاؤه قبل أن يكون الوالد) ، ما عليك سوى إضافة:

private void TreeView_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    bubblingBulkwark = false;
}

ولا تنس تسجيلها.

treeView.PreviewMouseDown += TreeView_PreviewMouseDown;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top