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;应该完成这项工作。

相关问题