私は 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 でオブジェクトを作成して配置すると、予想どおり、Canvas
XAML によって生成されたインクルードCanvas.Left
とCanvas.Top
プロパティ値がそれ自体に含まれるため、C# で試していることが機能するはずです。Canvas
しかし、ブラウザーのSLがすべて奇妙になることなく、C#から自分で左/上の値を設定することはできないようです。
何か案は?
編集:私のアプローチは正しいですが、キャンバス座標は整数ではなく浮動小数点である必要があります-詳細については、受け入れられた回答を参照してください。