0

我正在尝试编写一个用于测试图形应用程序的工具,基本上,这就是我所做的:

  1. 创建画布
  2. 创建形状并将它们放置在创建的画布上。

因此,当我正在编写自动化测试时,我需要等待 Canvas 被创建,然后才能开始在其上放置形状,我使用了 Loaded 事件,但没有创建任何形状。

我的问题是,什么时候开始在 Canvas 上放置元素?除了 Loaded 之外,还有特定的事件吗?

编辑

好吧,实际上它不是 Canvas,它是一个 Grid,它充当 ListView 的 DataTemplate,Grid 包含很多子项,我发现很难找到合适的时机说它最终加载了所有子项。

也许,我会继续检测父网格的可视化树中的任何变化,如果在某个特定时间内没有检测到任何变化,那么,我假设所有的孩子都加载并查看了?如果我决定这样走,Visual Tree 中的什么事件会因每次新更改而触发?

<Grid x:Class="Graphics.Stage.KPage" Name="Scaller"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:aero="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
    xmlns:model="clr-namespace:Graphics.Models;assembly=Graphics.Models"
    xmlns:p="clr-namespace:Graphics.Stage"
      Cursor="None"
    xmlns:Header_Footer="clr-namespace:Graphics.Stage.Header_Footer" AllowDrop="True"  Width="{Binding Path=Width}"  Height="{Binding Path=Height}"  >
    <Grid.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Graphics.Stage;component/Resources/StageResources.xaml"/>
                <ResourceDictionary Source="/Graphics.UserControls;component/SharedDictionaryGreen.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Grid.Resources>
    <Grid.LayoutTransform>
        <ScaleTransform   ScaleX="{Binding ElementName=PagesList, Path=ScaleX}"
                                         ScaleY="{Binding ElementName=PagesList, Path=ScaleY}"
                        ></ScaleTransform>
    </Grid.LayoutTransform>

    <aero:SystemDropShadowChrome Name="ShadowChrome" Opacity="0.75" Margin="0,0,-5,-5"  />  
    <Border  BorderBrush="{StaticResource dark}"  BorderThickness="1.5" Name="PageBorder"   >

            <Grid  Name="Sizer"   >


            <Canvas Name="Layout"  Background="{StaticResource light}" ClipToBounds="True" Cursor="None"/>

            <Canvas Name="ImportedImageLayer"  Background="Transparent" ClipToBounds="True" Cursor="None"/>

            <p:InkSurface  x:Name="LayerInkSurface"  Cursor="None"  />

            <p:TempSurface  x:Name="TempSurface0" Cursor="None"  />
            <p:TempSurface  x:Name="TempSurface1" Cursor="None"  />



            <p:Surface  x:Name="LayerOnTopTools"  Cursor="None"  >

            </p:Surface>


            <p:Surface  x:Name="DraggingSurface0"  Cursor="None" />
            <p:Surface  x:Name="DraggingSurface1"  Cursor="None" />

            <Header_Footer:HeaderFooterView x:Name="MyHeaderView" VerticalAlignment="Top" PictureVerticalAlignment="Top"  MyVerticalAlignment="Top" />
            <Header_Footer:HeaderFooterView x:Name="MyFooterView" VerticalAlignment="Bottom" PictureVerticalAlignment="Bottom" MyVerticalAlignment="Bottom" />

            <Canvas  Name="GridsCanvas"  ClipToBounds="True"  IsHitTestVisible="False">

            </Canvas>

            <p:TopViewLayer  x:Name="PageTopView"  ClipToBounds="True" />


        </Grid>

    </Border>

</Grid>
4

1 回答 1

0

如果事件发生Canvas后还没有准备好,Loaded也许你可以试试这个ContentRendered事件。

 ContentRendered += new EventHandler(MainWindow_ContentRendered);

 private void MainWindow_ContentRendered(object sender, EventArgs e)
 {
     // do the dew
 }
于 2012-12-27T04:16:16.473 回答