2011-11-07 29 views
0

这是我第一次使用Silverlight,因此,我对整个xaml标记样式是新手。我正在使用ESRI提供的silverlight库构建GIS应用程序。Silverlight启动生命周期并绑定

从我的理解,当从上到下分析XAML页面时,按顺序创建对象。它是否正确?我在我的主页的第38行创建了一个esri Map对象,然后在我的主页的第247行创建了一个DrawControl(我自己制作的绘图控件)。

绘图工具中的对象如何工作的一部分是通过将地图对象传递给构造函数来创建的。与名称X我的地图对象:NAME = “地图”,我有我的drawcontrol如下:

<local:DrawRootControl x:Name="DrawRoot" Height="152" Margin="216,10,0,0" Grid.Row="1" VerticalAlignment="Top" Visibility="Collapsed" map="{Binding ElementName=Map}"/> 

然后在我的控制,我有这个在后面的代码:

public static readonly DependencyProperty mapProperty = DependencyProperty.Register 
     (
      "map", 
      typeof(Map), 
      typeof(DrawRootControl), 
      null 
     ); 

    public Map map 
    { 
     get { return (Map)GetValue(mapProperty); } 
     set { SetValue(mapProperty, value); } 
    } 

。 .........

public DrawRootControl() 
    { 
     // Required to initialize variables 
     InitializeComponent(); 

     MyDrawObject = new Draw(map) 
     { 
      LineSymbol = CanvasDraw.Resources["DrawLineSymbol"] as LineSymbol, 
      FillSymbol = CanvasDraw.Resources["DrawFillSymbol"] as FillSymbol 
     }; 
     MyDrawObject.DrawComplete += MyDrawObject_DrawComplete;    
    } 

当我调试时,我的构造函数中的地图对象为null。我认为如果map是在主页的前面创建的,然后当我执行该绑定时通过,它不会是null,并且会被初始化和创建。也许我做了不正确的绑定?我并不完全理解这种约束性的东西。

任何帮助,将不胜感激。

+0

数据绑定直到初始化后才会发生。这是有道理的,因为如果控件还没有构建,没有什么可以绑定的 – kbmax

+0

你实际上并没有使用数据绑定。你只是手动设置一个属性。 –

+0

好的,我什么时候知道itialization何时结束?乔,我在我的xaml(第一个代码snippit在最后)绑定了地图=“{Binding ElementName = Map}” – Justin

回答

1

从我的理解来看,当XAML页面从上到下被解析时,按顺序创建对象。它是否正确?

是像html一样自上而下。例如:在绘图工具中的对象是如何工作的

<Grid x:Name="LayoutRoot" Background="White"> 
    <Rectangle Fill="#FFE53400" Height="132" /> 
    <Rectangle Fill="#FF0000E5" Height="132" Margin="0,51,0,0" /> 
</Grid> 

部分是,它是通过将地图对象的构造函数创建。

如果您依赖于另一个UI元素,则需要在DependencyProperty发生更改时实现回调来绘制控件。在这个例子中使用地图

public string Title 
    { 
     get { return (string)GetValue(TitleProperty); } 
     set { SetValue(TitleProperty, value); } 
    } 

    public static readonly DependencyProperty TitleProperty = 
     DependencyProperty.Register("Title", typeof(string), typeof(ComparisonReport), new PropertyMetadata(null, OnTitleChanged)); 

    private static void OnTitleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var o = d as ComparisonReport; 
     if (o != null && e.NewValue != null) 
     { 
      var n = ((ComparisonReport)d); 
      n.RadChart1.DefaultView.ChartArea.AxisX.Title = String.Format("{0} Comparison", e.NewValue); 
     } 
    } 

更换标题如果你已经写了一个自定义的控制,你可以等到OnApplyTemplate()此时您可以找到名字的部分(ESRI地图对象)。 GetTemplateChild然后可以附加到影响您的自定义绘图的esri事件。

+0

在OnTitleChanged事件上,它将标题更改为新值? – Justin

+0

另外,有没有办法让OnTitleChanged不是静态的,因为我想重用控件,如果我不得不在这个功能中设置地图,我也会被迫使用静态属性。 – Justin

+0

任何时候这个绑定被更新,它会导致OnTitleChanged被调用。静态是由于框架,你将不得不使用“d”这是你的类的具体实例;例如在我的情况下,我使用d来投射到特定的报告,所以我可以更新轴标题 –