どのように私はC#でリストボックスの右クリックイベントを通知することができます
-
11-09-2019 - |
質問
私は、ユーザーが右のコンテキストメニューアイテムを有効または無効にするには、既存のリストボックスのエントリまたは空の部分をクリックしたかどうかを判断しようとしています。
(DataGridViewのため)リサイズIにおいて行うことができた。
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);
私は既存のテキストをクリックした場合は、Result.VisualHitは、テキストボックスを示しているが、国境私は、エントリが正しかったかどうかを判断するためにそれを使用する場合、偽陰性を返すことになる(既存の行のテキストの前または後に空白スペースをクリックした場合)をクリック。
リストボックスやデータグリッドの両方のための任意のアイデア、?
解決
plsは以下のコードをチェックします。それはありますかどうかは、マウスポインタの下に項目名を印刷し、リストボックスコントロールのためのMouseRightButtonUpイベントハンドラです。
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;
}
これはリストボックスのために正常に動作する必要があります よろしく
他のヒント
メモリが提供している場合、
、右クリックイベントでは、実際にページのルート要素までクリックされた要素から泡。あなたは自分の代わりにリストボックスの項目にイベントハンドラをアタッチする場合は、個々の項目をクリックしを処理し、任意のさらなるバブリングを防止することができるようになります。イベントは、リストボックスのハンドラに到達した場合は、クリックすると、コントロールの空白領域で発生します。
別の方法としては、イベント引数のOriginalSourceプロパティをチェックしてみてくださいすることができますが、私は過去のものといくつかの問題があった。
所属していません StackOverflow