最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c# - Button command stops working after minimizing to system tray - Stack Overflow

programmeradmin2浏览0评论

I have a WPF application that listens to copy events and stores clipboard items in a ListView. Each ListViewItem contains a button that executes a command (EditClipboardTextCommand) to open an EditTextWindow.

When the application starts, clicking the button works as expected. After minimizing the application to the system tray and restoring it, the button no longer works.

If I minimize the app immediately after launching it and then restore it, the button never works again until I restart the application.

Minimizing the application (MainWindow.xaml.cs):

private void MinimizeApplication()
{
    Logger.Debug("Minimizing application.");
    if (viewModel is not
        {
            IsSettingsWindowOpen: false, IsClearAllHistoryWindowOpen: false, IsClearAllHistoryWindowOpen: false
        }) return;
    Hide();
    WindowState = WindowState.Minimized;
}

Restoring the application from the system tray (MainWindow.xaml.cs):

private void MaximizeApplication()
{
    Logger.Debug("Maximizing application.");
    if (WindowState != WindowState.Normal)
    {
        SetWindowsLocation();
        Show();

        Logger.Debug("Restore the window if it's minimized.");
        WindowState = WindowState.Normal;

        Logger.Debug("Bring the window to the foreground.");
        this.Activate();

        Logger.Debug("Temporarily set the window as topmost.");
        this.Topmost = true;
        this.Topmost = false;
    }
    else
        BringApplicationTtoTheFront();
    isApplicationOnFocus = true;
}

private void BringApplicationTtoTheFront()
{
    Logger.Debug("Bringing application to the front.");
    this.Activate();
    this.Topmost = true;
    this.Topmost = false;
    this.Focus();
}

ListView item with a button (MainWindow.xaml):

<GridViewColumn Header="Actions" Width="100">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <Button Content="Edit"
                    Command="{Binding DataContext.EditClipboardTextCommand, RelativeSource={RelativeSource AncestorType=Window}}"
                    CommandParameter="{Binding}" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

Setting a reference to the main window (MainWindow.xaml.cs):

public MainWindow()
{
    // Set reference to main window in the application.
    ReferenceClass.MainWindow = this;
}

The EditClipboardTextCommand implementation:

using ClipKeeper.Forms;
using ClipKeeper.Source.MVVM.Model;
using ClipKeeper.Source.MVVM.ViewModel;
using ClipKeeper.Source.Utils;
using System;
using System.Windows.Input;

namespace ClipKeeper.Source.Commands
{
    internal class EditClipboardTextCommand : ICommand
    {
        public event EventHandler? CanExecuteChanged;

        public BaseViewModel ViewModel { get; set; }

        public EditClipboardTextCommand(BaseViewModel viewModel)
        {
            ViewModel = viewModel;
        }

        public bool CanExecute(object? parameter)
        {
            return true;
        }
         
        public void Execute(object? parameter)
        {
            if (parameter is ClipboardItem clipboardItem)
            {
                EditTextWindow editTextWindow = new EditTextWindow(clipboardItem);
                editTextWindow.Owner = ReferenceClass.MainWindow; 
                ReferenceClass.EditTextWindow = editTextWindow;
                ViewModel.EditClipboardTextWindowOpen = true;
                editTextWindow.ShowDialog();
                ViewModel.EditClipboardTextWindowOpen = false;
            }
        }
    }
}

The command binding works before minimizing but, stops working after restoring from the system tray. Other UI elements in the ListViewItem remain interactive. No errors are thrown, but clicking the button does nothing.

The EditClipboardTextCommand should open a new window (EditTextWindow).

What I’ve tried:

  • Verifying that the DataContext of the button is still set correctly after restoring the application.
  • Ensuring the command binding remains active.
  • Checking if CanExecuteChanged fires after restoring the application.
  • Refreshing the ListView.

What could cause the button's command binding to stop working after minimizing and restoring from the system tray? How can I make sure the button remains functional after restoring the application?

发布评论

评论列表(0)

  1. 暂无评论
ok 不同模板 switch ($forum['model']) { /*case '0': include _include(APP_PATH . 'view/htm/read.htm'); break;*/ default: include _include(theme_load('read', $fid)); break; } } break; case '10': // 主题外链 / thread external link http_location(htmlspecialchars_decode(trim($thread['description']))); break; case '11': // 单页 / single page $attachlist = array(); $imagelist = array(); $thread['filelist'] = array(); $threadlist = NULL; $thread['files'] > 0 and list($attachlist, $imagelist, $thread['filelist']) = well_attach_find_by_tid($tid); $data = data_read_cache($tid); empty($data) and message(-1, lang('data_malformation')); $tidlist = $forum['threads'] ? page_find_by_fid($fid, $page, $pagesize) : NULL; if ($tidlist) { $tidarr = arrlist_values($tidlist, 'tid'); $threadlist = well_thread_find($tidarr, $pagesize); // 按之前tidlist排序 $threadlist = array2_sort_key($threadlist, $tidlist, 'tid'); } $allowpost = forum_access_user($fid, $gid, 'allowpost'); $allowupdate = forum_access_mod($fid, $gid, 'allowupdate'); $allowdelete = forum_access_mod($fid, $gid, 'allowdelete'); $access = array('allowpost' => $allowpost, 'allowupdate' => $allowupdate, 'allowdelete' => $allowdelete); $header['title'] = $thread['subject']; $header['mobile_link'] = $thread['url']; $header['keywords'] = $thread['keyword'] ? $thread['keyword'] : $thread['subject']; $header['description'] = $thread['description'] ? $thread['description'] : $thread['brief']; $_SESSION['fid'] = $fid; if ($ajax) { empty($conf['api_on']) and message(0, lang('closed')); $apilist['header'] = $header; $apilist['extra'] = $extra; $apilist['access'] = $access; $apilist['thread'] = well_thread_safe_info($thread); $apilist['thread_data'] = $data; $apilist['forum'] = $forum; $apilist['imagelist'] = $imagelist; $apilist['filelist'] = $thread['filelist']; $apilist['threadlist'] = $threadlist; message(0, $apilist); } else { include _include(theme_load('single_page', $fid)); } break; default: message(-1, lang('data_malformation')); break; } ?>