2012-09-17 22 views
1

Somewtimes WPF变成WTF之前=)需要的是适用所有绑定后,窗口的事件引发,但它被渲染

从MSDN:

FrameworkElement.Loaded event 当元素已布局时,呈现,和准备好互动。

Object lifetime events 加载的事件引发最终渲染之前,但布局系统之后计算出所有必要的值进行渲染。

我需要在应用所有绑定后调整代码背后的窗口屏幕放置。现在这在Loaded事件处理程序中完成。我看到窗户是如何跳到眼睛不太舒服的地方的。

UPDATE1

private void DialogViewLoaded(object sender, RoutedEventArgs e) 
     { 
      MaxHeight = SystemParameters.FullPrimaryScreenHeight * 0.8; 
      MaxWidth = SystemParameters.FullPrimaryScreenWidth * 0.8; 
      SizeToContent = SizeToContent.WidthAndHeight; 
      SizeToContent = SizeToContent.Manual; 
      MaxHeight = double.PositiveInfinity; 
      MaxWidth = double.PositiveInfinity; 

      WindowHelper.CenterWindowOnScreen(this); 
     } 

这个代码实现,我想在XAML来实现该功能。 Flexible XAML-only layout. Is it possible?

+0

“Window.Loaded”事件通常会调用加载视觉元素的“InitalizeComponents()”。所以在'Window.Loaded'运行时,没有可视元素。您可以使用[Dispatcher](http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx)在稍后的[DispatcherPriority](http:// msdn。 microsoft.com/en-us/library/system.windows.threading.dispatcherpriority.aspx)比'渲染',这意味着它会在所有渲染完成后运行,但我认为这不会阻止窗口跳跃 – Rachel

+0

我需要在渲染之前设置位置。 –

+0

什么样的绑定是基于?在绘制任何东西之前,您可能不得不在代码隐藏中做一些杂乱的事情来评估值并定位窗口。 – Rachel

回答

1
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     CompositionTarget.Rendering += new EventHandler(OnRendering); 
    } 
    void OnRendering(object sender, EventArgs e) 
    { 
     MaxHeight = SystemParameters.FullPrimaryScreenHeight * 0.8; 
     MaxWidth = SystemParameters.FullPrimaryScreenWidth * 0.8; 
     SizeToContent = SizeToContent.WidthAndHeight; 
     SizeToContent = SizeToContent.Manual; 
     MaxHeight = double.PositiveInfinity; 
     MaxWidth = double.PositiveInfinity; 
    } 
} 

CompositionTarget.Rendering发生之前的合成树的对象是rendered.I希望这将有助于。

+0

这是有效的,我会稍微等一下,如果没有更好的答案出现,请用赏金来接受这个答案,谢谢,但我很好奇为什么没有专门的事件来渲染某个元素。 –

+0

不,不幸的是,这不起作用。窗户是静止的。 –

0

您可以使用来自UserControl的DesiredSize.Height和DesiredSize.Width,它是窗口中的hostet。高度和宽度在加载事件之前已知。

相关问题