كيف يمكنني إخطارك بحدث نقرة بزر الماوس الأيمن من مربع القائمة في C #

StackOverflow https://stackoverflow.com/questions/1828133

  •  11-09-2019
  •  | 
  •  

سؤال

أحاول تحديد ما إذا كان المستخدم قد تم النقر فوقه على إدخال مربع ListBox موجود أو الجزء الفارغ، لتمكين أو تعطيل سكان السياق.

في WinForms (ل DataGridView) كنت قادرا على القيام به

var result = DGVTasks.HitTest(e.X, e.Y);
bool existingRowSelected = result .Type == DataGridViewHitTestType.Cell;

في DataGridView. الآن في WPF حاولت

Point pt = e.GetPosition((UIElement)LBXWorkflow);
HitTestResult result = VisualTreeHelper.HitTest(LBXWorkflow, pt);

reder.visualhit يظهر مربع النص إذا قمت بالنقر فوق النص الموجود، ولكن الحدود إذا قمت بالنقر فوق "مساحة فارغة" قبل أو بعد النص الموجود في سطر موجود (مما سيعود سالبا كاذبا إذا استخدمته لتحديد ما إذا كان الإدخال قد تم النقر فوق اليمين).

أي أفكار، لكل من ListBox و DataGrid؟

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

المحلول

الثابتة والمتنقلة التحقق من الكود أدناه؛ إنه معالج حدث MouseerightButtonup لعنصر تحكم ListBox الذي يطبع اسم العنصر ضمن مؤشر الماوس إذا كان هناك

private void listBox1_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
    object item = GetElementFromPoint(listBox1, e.GetPosition(listBox1));
    if (item!=null)
        Console.WriteLine(item);
    else
        Console.WriteLine("no item found");
}

private object GetElementFromPoint(ItemsControl itemsControl, Point point)
{
    // you can use either VisualTreeHelper.HitTest or itemsControl.InputHitTest method here; both of them would work
    //UIElement element = VisualTreeHelper.HitTest(itemsControl, point).VisualHit as UIElement;
    UIElement element = itemsControl.InputHitTest(point) as UIElement;
    while (element!=null)
    {
        if (element == itemsControl)
            return null;
        object item = itemsControl.ItemContainerGenerator.ItemFromContainer(element);
        if (!item.Equals(DependencyProperty.UnsetValue))
            return item;
        element = (UIElement)VisualTreeHelper.GetParent(element);
    }
    return null;
}

يجب أن يعمل هذا غرامة لتحديث ListBox

نصائح أخرى

إذا كانت الذاكرة تخدم، فإن فقاعات الأحداث النظيفة من العنصر الذي يتم النقر عليه بالفعل حتى العنصر الجذر في الصفحة. إذا قمت بإرفاق معالج الأحداث بالعناصر نفسها بدلا من مربع القائمة، فستتمكن من التعامل مع النقر على العناصر الفردية ومنعها من الفقاعات أكثر. إذا وصل الحدث إلى معالج ListBox، فقد حدثت النقر على منطقة فارغة من عنصر التحكم.

بدلا من ذلك، يمكنك تجربة التحقق من خاصية OriginalSource للحدث Args، لكنني تعاني من مشكلة في ذلك في الماضي.

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