Silverlight启动生命周期和绑定

时间:2011-11-07 15:51:05

标签: c# wpf silverlight

这是我第一次使用Silverlight,因此,我是整个xaml标记样式的新手。我正在使用ESRI提供的Silverlight库构建GIS应用程序。

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

绘图工具中的对象如何工作的部分原因是它是通过将地图对象传递给构造函数来创建的。使用名为x的Map对象:Name =“Map”,我的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;             
    }

当我调试时,我的构造函数中的map对象为null。我认为如果在主页中先前创建了map,然后在我执行该绑定时传递,则它将不为null并且将被初始化和创建。也许我做错了绑定?我完全不了解绑定的事情。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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发生更改时实现回调以绘制控件。在此示例中,将Title替换为Map

    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 map对象)。然后,您可以将GetTemplateChild附加到影响自定义绘图的esri事件。