2016-01-23 61 views
0

我有一个问题,我无法解决。我写了一个在托盘中工作的应用程序。一切工作正常,但当我点击右键(托盘图标)上下文菜单打开,然后我点击左键(在菜单项)执行该方法,但然后上下文菜单不会隐藏,直到此方法完成并保持屏幕的顶部。你能告诉我如何在点击后立即隐藏这个上下文菜单吗? 我对TaskbarIcon XAML代码:上下文菜单不会隐藏,直到点击操作完成wpf notifyicon

<tb:TaskbarIcon Name="Tray" IconSource="ico.ico" ToolTipText="text" Visibility="Visible" TrayLeftMouseUp="ShowWindow_Click"> 
      <tb:TaskbarIcon.ContextMenu> 
       <ContextMenu Name="ContextMenu"> 
        <ContextMenu.Style> 
         <Style TargetType="{x:Type ContextMenu}"> 
          <Setter Property="ItemsPanel" Value="{StaticResource MenuTPL}"/> 
         </Style> 
        </ContextMenu.Style> 
        <MenuItem x:Name="ShowWindow" Click="ShowWindow_Click" Header="show"></MenuItem> 
        <MenuItem x:Name="GetPoints" Click="Run_Click" Header="points"></MenuItem> 
        <MenuItem x:Name="Finish" Click="Zakoncz_Click" Header="exit"></MenuItem> 
       </ContextMenu> 
      </tb:TaskbarIcon.ContextMenu> 
     </tb:TaskbarIcon> 

回答

0

如果你有一个耗时的方法,就像在你的情况,你需要执行它在另一个线程。否则,GUI(在你的情况下,上下文菜单)冻结,因为耗时的任务在UI线程上执行。要解决这个问题,你可以使用BackgroundWorker

在这里我为大家提供一个完整的工作示例的一个方式,你怎么可以这样做:

XAML:

<Window x:Class="WpfApplication27.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:tb="http://www.hardcodet.net/taskbar" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <tb:TaskbarIcon Name="Tray" IconSource="ico.ico" ToolTipText="text" Visibility="Visible"> 
      <tb:TaskbarIcon.ContextMenu> 
       <ContextMenu Name="ContextMenu"> 
        <MenuItem x:Name="GetPoints" Click="Run_Click" Header="points"></MenuItem> 
       </ContextMenu> 
      </tb:TaskbarIcon.ContextMenu> 
     </tb:TaskbarIcon> 
    </Grid> 
</Window> 

代码隐藏:

public partial class MainWindow : Window 
{ 
    private readonly BackgroundWorker _worker; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     _worker = new BackgroundWorker(); 
     _worker.DoWork += worker_DoWork; 
    } 


    private void Run_Click(object sender, RoutedEventArgs e) 
    { 
     _worker.RunWorkerAsync(); 

    } 

    private void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //here is your time consuming task 
     for (int i = 0; i < 5000; i++) 
     { 
      Console.WriteLine(i + "Hello World"); 
     } 
    } 
} 
+0

THX它的工作原理: ) – kamciono5