2011-08-10 29 views
9

我的應用程序使用ClickOnce技術進行部署。但是,當用戶開始使用應用程序時,我遇到了問題用於再現問題的情況如下:ClickOnce和非活動主窗口

  1. 用戶點擊應用程序的快捷方式,以運行
  2. 的ClickOnce的「啓動程序」對話框,以檢查更新
  3. 應用程序「啓動應用程序「對話框消失
  4. 啓動畫面出現
  5. 顯示(登錄窗口)主窗口 - 但是這不是積極的,也有一個焦點

由於主窗口未激活,用戶必須先點擊才能開始輸入用戶名和密碼。我怎樣才能解決這個問題,讓主窗口在出現後處於活動狀態?我試着下面的代碼,但它不工作:

protected override void OnInitialized(EventArgs e) 
    { 
     while (!this.IsFocused) { this.Focus(); WPFWaitForPriority.WaitForPriority(DispatcherPriority.Background); } 
     base.OnInitialized(e); 
    } 
+0

我有此相同問題,我的應用程序之一。我嘗試了一切可能的辦法,使其成爲啓動時的聚焦窗口,但沒有任何工作。我不相信這是一個ClickOnce問題,但我從來沒有找到解決方案。我正在爲火災增加更多燃料。我給+1,因爲這是我見過的問題,但永遠無法解決。 – RLH

+0

謝謝RLH。希望有人會提出解決方案。 –

+0

我有一個ClickOnce WinForms應用程序,其啓動完全按照您描述的方式進行,並且我沒有遇到您描述的問題。也許它更像是一個WPF問題? –

回答

0

試試這個代碼: 僞代碼:

OnShown 
this.focus 

我的意思。 使用不同的事件。

+0

我已經試過了。不幸的是,沒有成功 –

0

我有一個WPF/ClickOnce應用程序,並沒有相同的問題。我不使用的App.xaml的的StartupUri,我手動顯示登錄窗口,而不是在App.xaml.cs如下:

protected override void OnStartup(StartupEventArgs e) 
    { 
     this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); 
     this.Exit += new ExitEventHandler(App_Exit);   
     base.OnStartup(e); 
     ShowLogin(); 
    } 

    private MainWindow _mainWindow; 

    private void ShowLogin() 
    {    

     _mainWindow = new MainWindow(delegate() 
     { 
      //....... 
     }); 

     _mainWindow.Closed += new EventHandler(_mainWindow_Closed); 

     this.MainWindow = _mainWindow; 
     this.MainWindow.Show();    
    } 
1

最有可能你給集中到閃屏。所以當它關閉時,再沒有任何焦點了。關閉窗體後,調用您想要獲得焦點的控件上的選擇方法(我猜的用戶名文本框)。

Select for Focus

0

按我的理解,你可以通過編程觸發點擊事件一次內部構造。

0

在啓動畫面關閉並顯示LoginForm後,LoginForm.Activate()怎麼樣?

0

也許試着把焦點放在那個窗體上的TextBox上。例如登錄名。

我認爲OnInitialized事件可能爲時尚早。 OnShown應該很好。

0

您是否使用Visual Studio?我知道如果您轉到項目選項卡下的表單屬性,您可以指定啓動對象。也許你可以指定你的主窗體並且可以在它之前加載splashscreen。

0

你嘗試過:

protected override void OnInitialized(EventArgs e) 
{ 
    while (this.CanFocus) { this.Focus(); WPFWaitForPriority.WaitForPriority(DispatcherPriority.Background); } 
    base.OnInitialized(e); 
}