【问题标题】:Button Click Event Getting Lost按钮单击事件迷路
【发布时间】:2010-05-10 14:50:24
【问题描述】:

我在 Silverlight 中有一个菜单和子菜单结构,我希望子菜单在父菜单项失去焦点时消失 - 标准菜单行为。我注意到单击子菜单项时子菜单的单击事件会丢失,因为父菜单项失去焦点并且子菜单消失了。

用代码更容易解​​释:

        ParentMenuBtn.Click += delegate
        {
            SubMenu.Visibility = (SubMenu.Visibility == Visibility.Visible) ? SubMenu.Collapsed : SubMenu.Visible;
        };
        ParentMenuBtn.LostFocus += delegate
        {
            SubMenu.Visibility = Visibility.Collapsed;
        };
        SubMenuBtn.Click += delegate
        {
            throw new Exception("This will never be thrown.");
        };

在我的示例中,当单击 SubMenuBtn 时,触发的第一个事件是 ParentMenuBtn.LostFocus(),它隐藏了 SubMenuBtn 的容器。一旦容器的可见性崩溃,就永远不会触发 Click 事件。

我宁愿避免每次都隐藏子菜单,但我有点惊讶的是 Click 事件从未因此触发......

我无法在 LostFocus() 事件中进行任何检查以查看我的 SubMenuBtn 是否具有焦点,因为在调用 LostFocus() 事件之后它才会获得焦点。也就是说,当 LostFocus() 被触发时,SubMenuBtn.IsFocused = false。

有人对此有任何想法吗?

【问题讨论】:

    标签: silverlight events button click


    【解决方案1】:

    我找到了解决方案——尽管它不像我希望的那样简单或优雅。解决方案是使用一个在执行前只暂停片刻的辅助线程。

    即。

    public partial class Navigation : UserControl
    {
        public Navigation()
        {
            ParentMenuBtn.Click += delegate
            {
                SubMenu.Visibility = (SubMenu.Visibility == Visibility.Visible) ? Visibility.Collapsed : Visibility.Visible;    
            };
            ParentMenuBtn.LostFocus += delegate(object sender, RoutedEventArgs e)
            {
                HideSubMenu(SubMenu);
            };
            SubMenuBtn.Click += delegate
            {
                //Sub Menu Button actions...
            };
    
        private void HideSubMenu(UIElement subMenu)
        {
            //Get the Main Page
            App app = (App)Application.Current;
            MainPage mainPage = (MainPage)app.RootVisual;
    
            Thread thread = new Thread(Navigation.HideSubMenu);
            thread.Start(new ThreadState(mainPage, subMenu));
        }
    
        private static void HideSubMenu(object threadStateObj)
        {
            ThreadState threadState = (ThreadState)threadStateObj;
            //Execute after 5 milliseconds...
            System.Threading.Thread.Sleep(5);
            threadState.MainPage.Dispatcher.BeginInvoke(delegate() {
               threadState.TargetElement.Visibility = Visibility.Collapsed;
            });
        }
    

    我只是使用一个名为 ThreadState 的简单对象来处理我想要保留的所有状态对象:

    public class ThreadState
    {
        public MainPage MainPage = null;
        public UIElement TargetElement = null;
    
        public ThreadState(MainPage mainPage, UIElement targetElement)
        {
            this.MainPage = mainPage;
            this.TargetElement = targetElement;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 2017-10-28
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多