2016-11-18 74 views
2

我有一個WPF應用程序。我需要在實例化它以獲得焦點之後最小化和恢復主窗口。我正在使用類似下面的類,但它不是我想要的,因爲當窗口恢復時它的大小無效。我試圖修改寬度和高度,但它不起作用。WPF UI在最小化和恢復後調整大小

public class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     ConfigureWindow(); 
    } 

    public void Show() 
    { 
     base.Show(); 
     UpdateWindowPositionAndSize(); 
     base.WindowState = WindowState.Normal; 
     base.Show(); 
    } 

    private void ConfigureWindow() 
    { 
     base.ShowActivated = true; 
     this.Focusable = true; 

     if (base.IsActive == false) 
     { 
      base.Activate(); 
     } 
     if (base.IsFocused == false) 
     { 
      base.Focus(); 
     } 
     base.WindowState = WindowState.Minimized; 
    } 

    private void UpdateWindowPositionAndSize() 
    { 
     this.Top = (SystemParameters.WorkArea.Height - this.Height)/2; 
     this.Left = (SystemParameters.WorkArea.Width - this.Width)/2; 
    } 
} 

我在做什麼錯了?還有另一種方式來獲得重點?對不起,如果問題太新。

更新:

具體是什麼需要?

我需要我的WPF應用程序出現在焦點和激活後啓動它。

爲什麼呢?

由於它將在Windows(7,8.1和10)用戶從文件上下文菜單(即外殼擴展名)中明確單擊子菜單後啓動。這是'爲什麼'我的客戶想要出現在屏幕前並聚焦。

什麼時候?

實例化後的窗口。

怎麼樣?

那麼,我做了一些研究,我發現了幾種方法來做到這一點。我嘗試過的方法之一是最小化窗口並將其還原。其他人喜歡使用函數SwitchToThisWindow或setforegroundwindow,但我想知道是否有更好的選擇。

什麼時候我已經試過最小化和還原窗口發生? (正確的尺寸)

嗯,這種方式讓我專注於主窗口,但它改變了寬度和高度。默認情況下,我將它們定義爲300(w)和300(h),但是在將窗口狀態更改爲正常後,這些值將變爲400(w)和350(h)。

如果我不做任何事情,它馬上就有重點?

...沒有...

UPDATE2:

我選擇在接下來的環節中使用的方法: https://www.roelvanlisdonk.nl/2014/09/05/reliable-bring-external-process-window-to-foreground-without-c/

+0

*「爲了獲得焦點,我需要最小化和恢復主窗口」* ...爲什麼? – Jim

+0

我知道它很髒:c,但是我的客戶想要在啓動應用程序後獲得焦點,如果有更優雅的方式,請讓我知道 – Henry

+0

您的主窗體類不是「MainWindow」嗎?詳細說明什麼是特定需求,爲什麼,何時,如何......因爲至少對我而言這是不清楚的。什麼是問題? ...表單打開時沒有重點? .... – Jim

回答

0

我不太清楚你的問題是什麼,但也許這可以幫助。

1.)從App.xaml刪除StartupUri="MainWindow.xaml";

2。)添加Startup="Application_Startup"

App.xaml.cs應該是這樣的:

public partial class App : Application 
{ 
    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     //Create new Instance of MainWindow 
     MainWindow mainWindow = new MainWindow(); 
     //Set Properties of that Window 
     UpdateWindowPositionAndSize(mainWindow); 

     //Show it ! 
     MainWindow = mainWindow; //This is the Application.MainWindow Property - not needed 
     mainWindow.ShowDialog(); 
    } 

    private void UpdateWindowPositionAndSize(MainWindow mainWindow) 
    { 
     //Do your modifications here 
     mainWindow.Top = (SystemParameters.WorkArea.Height - mainWindow.Height)/2; 
     mainWindow.Left = (SystemParameters.WorkArea.Width - mainWindow.Width)/2; 
    } 
} 

所以基本上你只需要修改你的Window直到所有完成。 沒有必要先顯示它,改變它的位置,然後將其帶回上 - 如果我得到你的「用例」的權利。

因爲對我來說,它看起來像你都躲在窗口做你的「定位」。 但我認爲這是更好地做到這一點的時候Initializing


只是一個短期的在你的代碼到目前爲止評論:

ConfigureWindow()僅做minimize。 你的代碼的其餘部分是無用的原因顯然是窗口失去時,它的最小化的聚焦。

我會建議不要創建已經存在名稱的方法。 enter image description here

這隻會導致cusfusion。

如果你有問題WindowState = WindowState.Minimized;你可以嘗試Hide()Activate()。調用Window.Show();窗口時將有重點

默認情況下。請點擊這裏查詢details

同樣在設置了WindowState = WindowState.Minimized;之後,您不需要再次撥打base.Show(); - 窗口已顯示。 WindowState = WindowState.Normal;應該完成這項工作。

相關問題