6

私は Silverlight 3/C# を使用しており、ユーザーがボタンをクリックしたことに応じて、いくつかの XAML オブジェクトをプログラムで作成しようとしています。

Canvasただし、作成したオブジェクトを配置できないようです。値を指定SetValue()して newCanvasを呼び出すとCanvas.LeftProperty、ブラウザ ウィンドウがクリアされて空の画面になります。

私は問題を示す単純な関数を持っています (私はもっと複雑なものから始めました):

    private Canvas MakeNewCanvas()
    {
        Canvas newCanvas = new Canvas();
        newCanvas.Width = newCanvas.Height = 50;
        newCanvas.SetValue(Canvas.LeftProperty, 10);
        return newCanvas;
    }

そして、これを呼び出す単純なボタン クリック ハンドラー:

    private void MyButton_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        myPage.Children.Add(MakeNewCanvas());
    }

注意: myPage は、アプリの MainPage XAML ファイルで定義された Canvas オブジェクトです。

Firefox で実行されている SL アプリを使用して VS デバッガーでこれを追跡しました。このSetValue()行を実行するたびに、ブラウザーが白くなり、データのダウンロードを開始します (ステータス バーによると)。次のようなもので XAML ツリーにSetValue()配置した後、呼び出してみました。Canvas

    myPage.Children.Add(newCanvas);
    newCanvas.SetValue(Canvas.LeftProperty, 10);

しかし、違いはありません。呼び出しがヒットするとすぐSetValue()に、ブラウザーが白くなります。

クラスには、依存関係プロパティの列挙値を持つ関数をCanvas除いて、それ自体に Left/Top を設定する直接的な方法がないようです。SetValue()andもCanvas.SetLeft()ありCanvas.SetTop()ますが、それらはただのシムだと思いますSetValue()。それらを使用しても、とにかく役に立ちませんでした。

を呼び出さないとSetValue()、ご想像のとおり、キャンバス (および追加した子オブジェクト) が SL アプリの左上に表示されます。

Expression Blend でオブジェクトを作成して配置すると、予想どおり、CanvasXAML によって生成されたインクルードCanvas.LeftCanvas.Topプロパティ値がそれ自体に含まれるため、C# で試していることが機能するはずです。Canvas

しかし、ブラウザーのSLがすべて奇妙になることなく、C#から自分で左/上の値を設定することはできないようです。

何か案は?

編集:私のアプローチは正しいですが、キャンバス座標は整数ではなく浮動小数点である必要があります-詳細については、受け入れられた回答を参照してください。

4

2 に答える 2

14

コードを試してみましたが、デバッガーが例外をキャッチすると、次のようになります。

System.Double 型の DependencyProperty は、System.Int32 型のオブジェクトには設定できません。

これは本当にばかげた落とし穴です。SetValue は Object のみを受け取るため、このような問題が発生しやすくなります。

次のいずれかを試してください。

newCanvas.SetValue(Canvas.LeftProperty, 10.0);

また

Canvas.SetLeft(newCanvas, 10);

そしてそれはおそらくうまくいくでしょう。

于 2009-11-08T17:50:21.077 に答える
2

アタッチされたプロパティの動作は、最初は少し混乱する可能性があります。

プロパティCanvas.LeftPropertyおよびCanvas.TopPropertyは、キャンバスの子オブジェクトに適用されます。したがって、これらは子オブジェクトがに配置されている場合にのみ意味がありますCanvas。WPF / SLオブジェクトはそれ自体を配置しないことを理解することが重要です。オブジェクトを配置する場所を決定するのは、包含パネル次第です。

私は、がそのタイプでmyPageはないのではないかと思いますCanvas。おそらく、そのGridようなプロパティを探すのに苦労したとしても、そのようなプロパティをどうするかはわかりません(そうではありません)。

新しいCanvasを具体的に配置するには、Canvasに追加する必要があります。

于 2009-11-08T16:41:23.477 に答える