【问题标题】:Unable to call Close on Window using a ThumbnailToolBarButton无法使用 ThumbnailToolBarButton 调用 Close on Window
【发布时间】:2011-10-19 03:45:32
【问题描述】:

我正在尝试通过单击 ThumbnailToolBarButton 按钮来关闭全新 WPF 应用程序中的窗口(对默认生成的 xaml 没有更改)。当我尝试这样做时,出现以下错误:

    System.InvalidOperationException was unhandled
    Message=Operation is not valid due to the current state of the object.
    Source=WindowsBase
    StackTrace:
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
   at System.Windows.Forms.NativeWindow.WndProc(Message& m)
   at Microsoft.WindowsAPICodePack.Taskbar.ThumbnailToolbarProxyWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at System.Windows.Application.Run()
   at WpfApplication1.App.Main() in d:\documents\visual studio 2010\Projects\WpfApplication1\WpfApplication1\obj\x86\Debug\App.g.cs:line 0
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
   InnerException: 

这是我的代码:

    using System;
    using System.Reflection;
    using System.Windows;
    using System.Windows.Interop;
    using Microsoft.WindowsAPICodePack.Taskbar;

    namespace WpfApplication1
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();

                Loaded += new RoutedEventHandler(MainWindow_Loaded);
            }

            void  MainWindow_Loaded(object sender, RoutedEventArgs e)
            {
                ThumbnailToolBarButton thumbCancel = new ThumbnailToolBarButton(System.Drawing.Icon.ExtractAssociatedIcon(Assembly.GetEntryAssembly().Location), "Cancel");

                thumbCancel.Click += new EventHandler<ThumbnailButtonClickedEventArgs>(thumbCancel_Click);

                TaskbarManager.Instance.ThumbnailToolBars.AddButtons(new WindowInteropHelper(this).Handle, thumbCancel);
            }

            void thumbCancel_Click(object sender, ThumbnailButtonClickedEventArgs e)
            {
                Close();
            }
        }
    }

谢谢。

【问题讨论】:

  • 我没有看到您的 MainWindow 实例和 thumbCancel 实例之间有任何联系!如何在视图中看到此按钮?
  • 行:TaskbarManager.Instance.ThumbnailToolBars.AddButtons(new WindowInteropHelper(this).Handle, thumbCancel);将按钮添加到 ThumbnailToolBar。如果您将所有代码添加到 MainWINdow.xaml.cs 中的新 wpf 应用程序并点击播放,您将在 ThumbnailToolBar 中看到该按钮。

标签: wpf window windows-api-code-pack


【解决方案1】:

也许您正在从 WPF 下方删除 Win32 窗口。

我没有准备好尝试它,但我敢打赌,如果您将 Close() 调用更改为 BeginInvoke() 以触发关闭,那么它将允许处理从 thumbCancel_Click 返回并处理关闭适当的时间。

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 2019-12-03
    • 2019-10-11
    • 2016-05-07
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    相关资源
    最近更新 更多