【问题标题】:How to detect the first show of a WPF Window?如何检测 WPF 窗口的第一次显示?
【发布时间】:2013-04-12 22:30:49
【问题描述】:

我想知道哪种方法是检测 WPF 窗口何时首次显示的正确方法?

【问题讨论】:

  • WinForms 有一个 Shown 事件,但我认为它在 WPF 中不可用。 MayeInitialized是正确的使用方式

标签: c# .net wpf window


【解决方案1】:

有一个名为Loaded 的事件,您可以使用它来确定您的窗口何时准备就绪。

来自MSDN

在元素布局、渲染并准备好交互时发生。

在 XAML 中设置处理程序

<StackPanel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.FELoaded"
Loaded="OnLoad"
Name="root">
</StackPanel>

添加代码

void OnLoad(object sender, RoutedEventArgs e)
{
    Button b1 = new Button();
    b1.Content = "New Button";
    root.Children.Add(b1);
    b1.Height = 25;
    b1.Width = 200;
    b1.HorizontalAlignment = HorizontalAlignment.Left;
}

【讨论】:

【解决方案2】:

我建议做一个 bool 标志并检查它,并在构造函数中将其设置为 true

bool FirstTime = true;

void OnLoad(object sender, RoutedEventArgs e)
{
     if (FirstTime)
     {
          FirstTime = false;
          //do your stuff first-time
     }
     else
     {
           //do your stuff for other
     }
}

【讨论】:

  • 这永远不会到达else 子句,因为OnLoad 只会被调用一次。第一次之前的窗口是Shown。 OP 的问题是 WPF 没有 Window.OnShown 微不足道的等价物。
【解决方案3】:

Loaded 可以多次调用。

The Loaded event and the Initialized event

根据我的测试和上面的链接,Loaded 事件可以被多次触发。
因此,您需要在 OnLoaded 处理程序中设置一个标志。

例如,如果 Stack Panel 在 TabItem 控件中,则每次进入 tab 时都会调用loaded。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
相关资源
最近更新 更多