Получить значение canvas не должно возвращать ноль - PullRequest
1 голос
/ 07 февраля 2012

В MainPage.xaml у меня есть 2 элемента управления canvas (bd1 и ball), которые представляют 2 слоя.

    <Canvas  x:Name="ContentCanvas" Width="354" Height="669">
            <Canvas.Background>
                    <RadialGradientBrush>
                        <GradientStop Color="#FF9D0A0A" Offset="0" />
                        <GradientStop Color="Black" Offset="1" />
                    </RadialGradientBrush>
            </Canvas.Background>
            <Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                        x:Name="bd1" Width="370" Height="480" 
                        Clip="F1 M 0,0L 640,0L 640,480L 0,480L 0,0"                                                                  MouseMove="Canvas_MouseMove" HorizontalAlignment="Left" VerticalAlignment="Top">
                    <Canvas.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="0" CenterX="0.5" CenterY="0.5" />
                            <TranslateTransform X="0" Y="0" />
                            <ScaleTransform ScaleX="1" ScaleY="1" />
                            <SkewTransform AngleX="0" AngleY="0"/>
                        </TransformGroup>
                    </Canvas.RenderTransform>
                    <Path....../>
                    ........
            </Canvas>
            <Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="ball" 
                        Width="54" Height="52.5" Clip="F1 M 0,0L 54,0L 54,52.5L 0,52.5L 0,0"
                         MouseMove="Canvas_MouseMove" HorizontalAlignment="Left" VerticalAlignment="Top">
                    <Canvas.RenderTransform>
                        <TransformGroup>
                            <RotateTransform Angle="0" CenterX="0.5" CenterY="0.5" />
                            <TranslateTransform X="0" Y="0" />
                            <ScaleTransform ScaleX="1" ScaleY="1" />
                            <SkewTransform AngleX="0" AngleY="0"/>
                        </TransformGroup>
                    </Canvas.RenderTransform>
                    <Canvas Width="640" Height="480.425" Canvas.Left="0" Canvas.Top="0">
                        <Ellipse x:Name="Ellipse" Width="54" Height="52.5" Canvas.Left="4.17233e-007" Canvas.Top="2.03252e-005" Stretch="Fill" StrokeLineJoin="Round" Stroke="#FFFF0000">
                            <Ellipse.Fill>
                                <LinearGradientBrush StartPoint="0.0633299,0.762378" EndPoint="0.93667,0.237621">
                                    <LinearGradientBrush.GradientStops>
                                        <GradientStop Color="#FF000000" Offset="0"/>
                                        <GradientStop Color="#FFFFFFFF" Offset="1"/>
                                    </LinearGradientBrush.GradientStops>
                                </LinearGradientBrush>
                            </Ellipse.Fill>
                        </Ellipse>
                    </Canvas>
                </Canvas>

Для этого я создал класс Layer со свойством Canvas:

    public class Layer
    {
            public Layer() { }
            public Layer(Canvas canvas, Tipologie tip) 
            {
                ThisCanvas = canvas; Tip = tip;
            }
            public string Name { get; set; }  
            private Canvas canv;
            public Canvas ThisCanvas
            {
                get { return canv; }
                set
                {                
                    canv = value;
                    if (value != null)                        
                        Name = value.GetValue(Canvas.NameProperty) as string;
                }
            }
    }

В классе MainPage у меня есть глобальная коллекция типа Layer. Изначально я положил в коллекцию 2 слоя.

    private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
    {
        Layers[0] = new Layer(); Layers[0].ThisCanvas = GetTemplateChild("bd1") as Canvas;
        Layers[1] = new Layer(); Layers[1].ThisCanvas = ball;
        LayerSelector.ItemsSource = Layers;
    } 
    Layer[] Layers = new Layer[2];

Проблема в том, что элементы управления bd1 и ball canvas имеют значение null. Я также попытался поместить код в конструктор страницы, но это была та же проблема.

Я не могу этого объяснить.

Я что-то не так делаю? Заранее спасибо!

1 Ответ

0 голосов
/ 07 февраля 2012

Если вы передадите Canvas в конструкторе, он никогда не будет нулевым, если вы не переназначите его где-то еще.

public class Layer {
    public Layer(Canvas canvas) {
        this.canvas = canvas;
    }

    private Canvas canvas;
    public Canvas ThisCanvas {
        get { return canvas; }
        set { canvas = value; }
    }

    ...
}

...

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) {
    Layers[0] = new Layer(GetTemplateChild("bd1") as Canvas);
    Layers[1] = new Layer(ball);
    LayerSelector.ItemsSource = Layers;
}
Layer[] Layers = new Layer[2]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...