首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建窗口-弹出窗口

创建窗口-弹出窗口
EN

Stack Overflow用户
提问于 2010-06-29 14:12:28
回答 1查看 2.3K关注 0票数 2

所谓窗口弹出,我指的是弹出窗口,它只停留在窗口/应用程序中。据我所知,我必须显式处理弹出窗口的显示/隐藏。

应用程序.当前.激活/停用

Application.Current.MainWindow.Activated/Deactivated

激活/停用

我想确保Alt隐藏/显示弹出窗口,win-D隐藏弹出,在同一应用程序中切换窗口不应该做任何事情,从任务栏恢复/最大化应该显示弹出。

我已经为所有这些事件编写了处理程序,他们正在杀死我,为什么这是一个令人恼火的问题。必须有一个简单的方法来处理这件事。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2010-06-30 02:36:34

一个事件处理程序应该足以完成整个任务。

首先,在App.xaml中添加使用附加属性设置事件处理程序的窗口样式:

代码语言:javascript
复制
<Style TargetType="Window">
  <Setter Property="local:PopupWindowControl.AttachHandler" Value="true" />
</Style>

标记所有需要特殊行为的窗口:

代码语言:javascript
复制
<Window local:PopupWindowControl.HideWhenAppInactive="true" ... >

现在只需要创建附加的属性和更新方法。

  • "HideWhenAppInactive“是一个bool附加属性,用于标记Windows和弹出窗口。它还维护有此属性的所有弹出窗口的记录,set.
  • "AttachHandler“是一个带有PropertyChangedCallback的bool附加属性,它是一种更新handler.
  • "Update”可见性的方法,并根据是否存在可见和活动窗口

来更新弹出窗口。

看起来会是这样的:

代码语言:javascript
复制
public class PopupWindowControl : DependencyObject
{
  // HideWhenAppInactive
  public static bool GetHideWhenAppInactive(DependencyObject obj) { return (bool)obj.GetValue(HideWhenAppInactiveProperty); }
  public static void SetHideWhenAppInactive(DependencyObject obj, bool value) { obj.SetValue(HideWhenAppInactiveProperty, value); }
  public static readonly DependencyProperty HideWhenAppInactiveProperty = DependencyProperty.RegisterAttached("HideWhenAppInactive", typeof(bool), typeof(PopupWindowControl), new PropertyMetadata
    {
      PropertyChangedCallback = (obj, e) =>
        {
          if((bool)e.NewValue && obj is Popup)
          {
            if((_cleanupCounter++ % 10000) == 0)
              _hideWhenInactivePopups = (from weakRef in _hideWhenInactivePopups where weakRef.IsAlive select weakRef).ToList();

            _hideWhenInactivePopups.Add(new WeakReference(obj));
          }
        }
    });

  // AttachHandler
  public static bool GetAttachHandler(DependencyObject obj) { return (bool)obj.GetValue(AttachHandlerProperty); }
  public static void SetAttachHandler(DependencyObject obj, bool value) { obj.SetValue(AttachHandlerProperty, value); }
  public static readonly DependencyProperty AttachHandlerProperty = DependencyProperty.RegisterAttached("AttachHandler", typeof(bool), typeof(PopupWindowControl), new PropertyMetadata
  {
    PropertyChangedCallback = (obj, e) =>
    {
      if((bool)e.NewValue)
      {
        var window = (Window)obj;
        window.Activated += Update;
        window.Deactivated += Update;
        window.StateChanged += Update;
      }
    }
  });

  private static void Update(object sender, EventArgs e)
  {
    var active =
      Application.Current.Windows.OfType<Window>().Where(win =>
        win.IsActive &&
        win.Visibility==Visibility.Visible &&
        win.WindowState != WindowState.Minimized)
        .Any();

    // First update Windows marked HideWhenAppInactive
    foreach(var popupWindow in Application.Current.Windows.OfType<Window>().Where(win => GetHideWhenAppInactive(win)))
      popupWindow.Visibility = active ? Visibility.Visible : Visibility.Hidden;

    // Then update Popups marked HideWhenAppInactive
    if(active && _temporarilyHiddenPopups!=null)
    {
      foreach(var popup in _temporarilyHiddenPopups)
        popup.IsOpen = true;
      _temporarilyHiddenPopups = null;
    }
    else if(!active)
    {
      if(_temporarilyHiddenPopups==null) _temporarilyHiddenPopups = new List<Popup>();
      foreach(var popup in
        (from weak in _hideWhenInactivePopups 
         let popup = weak.Target as Popup
         where popup!=null && popup.IsOpen && GetHideWhenAppInactive(popup)
         select popup))
      {
        _temporarilyHiddenPopups.Add(popup);
        popup.IsOpen = false;
      }
    }
  }

  private static List<WeakReference> _hideWhenInactivePopups = new List<WeakReference>();
  private static List<Popup> _temporarilyHiddenPopups;
  private static int _cleanupCounter;
}

请注意,当"AttachHandler“或"HideWhenAppInactive”设置为false时,我没有添加任何代码来分离处理程序,因为为此目的,它们永远不会以这种方式使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3141489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档