문제

특정 항목을 선택/점검 한 후 컨텍스트 멘테이프를 열어 두는 것이 가능합니까?

간단한 컨텍스트 메뉴를 사용하여 필터를 설정할 계획입니다 (이 방법으로 메뉴 나 마우스 오른쪽 버튼 클릭 옵션으로 동일한 필터를 사용할 수 있습니다).

메뉴에는 여러 항목이 나열되어 있으며, 기본 확인 기능을 사용하여 항목을 선택할 수 있기를 원합니다. 선택이 완료되면 사용자는 필터 활성화 옵션을 클릭하거나 메뉴 외부를 클릭하여 필터를 활성화하거나 취소 할 수 있습니다.

선택/클릭 이벤트에서 메뉴가 일반적으로 닫힙니다. 클릭 이벤트에서 메뉴를 열어 두는 것이 가능합니까?

도움이 되었습니까?

해결책

항목을 클릭 할 때 ContextMenu가 닫히지 않도록하려면 다음을 수행하십시오.

Mousedown 컨텍스트 menuitems의 깃발을 false로 설정 한 다음 컨텍스트 만의 마지막 이벤트에서 true로 다시 설정하십시오.

예시:

Private blnClose As Boolean = True

Private Sub MoveUpToolStripMenuItem_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MoveUpToolStripMenuItem.MouseDown

     blnClose = False

End Sub

Private Sub ContextMenuStrip1_Closing(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripDropDownClosingEventArgs) Handles ContextMenuStrip1.Closing

     e.Cancel = Not blnClose
     blnClose = True

End Sub

다른 팁

미래의 프로그래머 가이 작업을 수행하는 방법을 궁금해하는 경우 이것이 제가 알아 낸 것입니다. 항목을 클릭하면 상황에 맞는 메뉴가 닫히지 않습니다. 컨텍스트 메뉴 스트립 닫기 이벤트를 만들고 닫기 이유를 클릭 한 경우 닫기 이벤트를 취소하기 위해 if 문을 설정하십시오.

private void contextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
    if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked)
        e.Cancel = true;
}

마감 이벤트

e.cancel = 메뉴를 열어 두려면 true를 설정하십시오

문제는 이벤트가 클릭 한 내용을 알려주지 않으므로 직접 추적해야한다는 것입니다. 메뉴를 열어두고 싶은 항목의 클릭 이벤트에서 깃발을 설정하십시오. 그런 다음 마감 이벤트에서 플래그를 점검하고 e.cancel을 적절하게 설정하십시오.

나는 맥락에서 이에 대한 재산이 있다고 생각하지 않습니다.

응용 프로그램에서 사용하는 해결 방법은 ContextMenustrip의 클릭 된 이벤트에서 처리를 수행한다는 것입니다. 그런 다음 컨텍스트 메뉴가 열리기를 원한다면 간단히 ContextMenustrip.show를 호출합니다.

맥락에서 컨텍스트에 한 레벨 만 있으면 잘 작동합니다. 하위 메뉴와 하위 서브 메뉴가 있다면 클릭 전에 열린 메뉴를 다시 선택해야하며 어떻게 할 수 있는지 잘 모르겠습니다 ...

onclosing, do : e.cancel = e.closereason! = ToolStripdropdownClosereason.closecalled; 그런 다음 닫기로 결정하면 Close ()를 호출하십시오.

이것이 나의 방법입니다. 그것은 깜박임이없고 - 내 생각 - 조금 더 유연하다고 생각합니다.

ToolStripMenuitems 세트가있는 경우 토글 버튼 (옵션 켜기/OFF)으로 사용하려는 경우 다음과 같습니다.

(그만큼 ctxWildCards 단지 나의 것입니다 ContextMenuStrip, 파일 유형을 기반으로 필터를 선택하는 데 사용됩니다 - 검색 또는 filedialogs 용)

이것은 Visual Basic (분명히!;)에 있으므로 프로그래밍 방식으로 처리하거나 'Handles ...'Clauses를 사용할 수 있습니다.

  Private Sub OnOffToolStripMenuItem_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) 

    Dim t = TryCast(sender, ToolStripMenuItem)
    If Not t Is Nothing Then
        'Since you may have more On/off-Items, check to see if the Owner is the ContextMenuStrip 
        If t.Owner Is ctxWildCards Then
           ' The ContextMenuStrip will stay open on Right-click, i.e. the user can check and close by clicking 'normally'
            ctxWildCards.AutoClose = (e.Button = Windows.Forms.MouseButtons.Left)
        End If
        'Just me using a custom image for checked items.
        t.Checked = Not t.Checked
        t.Image = If(t.Checked, rdoImage, Nothing)
    End If
  End Sub

 ' On leaving ToolStripMenuItems of the ContextMenuStrip, allow it to AutoClose
  Private Sub OnOffToolStripMenuItem_MouseLeave(sender As System.Object, e As System.EventArgs)
  ctxWildCards.AutoClose = True
End Sub

내가 이상한 것을 찾은 것은 그게 그게 그것입니다 ContextMenuStrip.Closing 이벤트 화재 ~ 전에 그만큼 ToolStripMenuItem.Click 이벤트. 해결책은 사용하는 것이 었습니다 ContextMenuStrip.ItemClicked 당신이 가진 이벤트 e.ClickedItem, 그런 다음 클릭하면 닫히지 않는 항목 중 하나인지 확인합니다. ContextMenuStrip, 적절한 깃발을 설정하십시오. 그런 다음 ContextMenuStrip.Closing 당신은 설정할 수 있습니다 e.Cancel = true; 플래그도 설정된 경우. 그래도 깃발을 재설정하는 것을 잊지 마십시오.

bool isRunAtStartupClicked;
private void ContextMenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{   
    if (e.ClickedItem == trayIcon.ContextMenuStrip.Items["miRunAtStartup"])
    {   
        isRunAtStartupClicked = true;
    }
}

private void ContextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{   
    if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked)
    {   
        if (isRunAtStartupClicked)
        {   
            isRunAtStartupClicked = false;
            e.Cancel = true;
        }
    }
}

깜빡이는 없이이 작업을 수행 한 가장 좋은 방법은 드롭 다운 메뉴의 모든 버튼에 Mousedown 및 Mouseleave 이벤트를 사용하는 것입니다.

예시:

Private Sub ToolStripMenuItem2_Mousedown(sender As Object, e As EventArgs) Handles ToolStripMenuItem2.MouseDown
        ΥπηρεσίεςToolStripMenuItem.DropDown.AutoClose = False
End Sub

Private Sub ToolStripMenuItem2_MouseLeave(sender As Object, e As EventArgs) Handles ToolStripMenuItem2.MouseLeave
        ΥπηρεσίεςToolStripMenuItem.DropDown.AutoClose = True
End Sub

나는 이것이 나의 목적에 유용하다는 것을 알았다.

Private Sub CM_Closing(sender As Object, e As ToolStripDropDownClosingEventArgs) Handles CM.Closing
    If e.CloseReason = ToolStripDropDownCloseReason.ItemClicked Then
        Dim ItemClicked As String = CM.GetItemAt(New Point(Cursor.Position.X - CM.Left, Cursor.Position.Y - CM.Top)).Name
        If ItemClicked = "CMHeader" Then
            e.Cancel = True
        End If
    End If
End Sub

당신은 사용할 수 있습니다 ItemClicked 태그 나 다른 속성을 읽습니다.

나는 단지 컨텍스트 메뉴가 어떤 항목에 영향을 미치는지 사용자에게 명확하게하는 간단한 항목을 원했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top