2016-01-23 20 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