WPF Popup hiding problem

后端 未结 6 1548
耶瑟儿~
耶瑟儿~ 2021-01-13 22:59

Suppose you have a ToggleButton for opening a Popup, same behaviour as all known elements as ComboBox etc.

... which is this c

6条回答
  •  南笙
    南笙 (楼主)
    2021-01-13 23:23

    It seems to me, there are a two problems - one is to adress the problem, that clicks inside the popup are potentially again handled according to it's the position in the visual tree.

    The second problem is - autoclose via click - happens really every time you click outside the popup and can trigger additional events. Even you click the "open button" to close. The problem is - you don't know which value was set before at popup.isOpen - becase it always is false for the click eventhandler of the open button.

    I don't use a toggleButton for saving memory, but i think the key problem is the same. The toggleButton already is false in the moment you click on it.

    My example popup is defined like that:

    
    

    If you click on the placement target - which was the "open button" the popup closes and at the same time the click event of the button was handled but the popup.IsOpen property was already 'false' - so it was opened again.

    What I did to solve this was to subscribe the popups "Closed" event, saved the time - blocking reopen for a second.

    DateTime? LastClose = new DateTime?();
    
    private void Popup_Closed(object sender, EventArgs e)
    {    LastClose = DateTime.Now;    }
    
    public bool AllowReopen
    {
        get {
                if ((popup == null) || (popup.IsOpen)) return false; 
                //You cannot open, when the template isn't applied or it is already open
    
                return !LastClose.HasValue || (DateTime.Now - LastClose.Value) > new TimeSpan(0,0,1) /*1s*/;
            }
    }
    
    
    public void OpenPopup()
    {
         if (!AllowReopen) return;
    
         popup.IsOpen = true;
    }
    

提交回复
热议问题