0

Canvasを含むDataTemplateでListBoxを使用しています。次に、そのキャンバスを含むグリッドの左/上をバインドして、特定のポイントに移動します。

次に、指定したX、Y座標を中心に子グリッドを配置します。子グリッドのサイズは、その内容に基づいて変化します。私は、TranslateTransformを使用してグリッドをその幅の半分だけ移動することによってこれを達成することを計画していました。

そのTranslateTransformを設定する方法がわかりませんが、ElementNameバインディングがDataTemplate内で機能しないためです。これをどのように達成できるかについてのアイデアはありますか?

<ItemsControl ItemsSource="{TemplateBinding SomeCollection}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Canvas>
                <Grid x:Name="Container" 
                        Canvas.Left="{Binding X}" 
                        Canvas.Top="{Binding Y}"
                        Background="#88000000">
                    <Grid.RenderTransform>
                    <TranslateTransform X="{Binding ActualWidth, ElementName=Container, Converter={StaticResource NegativeHalfConverter}}"
                                        Y="{Binding ActualHeight, ElementName=Container, Converter={StaticResource NegativeHalfConverter}}" />
                </Grid.RenderTransform>
                <TextBlock Text="{Binding SomeValue}" FontSize="36" Foreground="White" />
            </Grid>
        </Canvas>
    </DataTemplate>
</ItemsControl.ItemTemplate>

`

4

3 に答える 3

0

ElementNameバインディングはDataTemplateの名前スコープで機能するはずですが、ActualWidth/Heightプロパティにバインドするときにバインディングが正しく更新されないという不満を言う人を見かけました。おそらく、複雑なセットアップを行う代わりに、Pointパラメーターを受け取り、関連するオブジェクト(グリッド)のパラメーターまたはサイズが変更されるたびにCanvas.Left/Topプロパティを更新するアタッチされた動作を実装することができます。

于 2012-12-11T09:23:57.943 に答える
0

障害はバインディング自体にあるのではなく、ActualWidth/ActualHeightプロパティがバインドできないことを意味する機能にあるように見えます。フィリップに感謝します。

これを修正するために、SizeChangedイベントでActualWidth/Heightを持つように更新するいくつかの新しい依存関係プロパティを使用して派生グリッドを作成しました。次に、上記のようにDataTemplateを使用し、これらの新しいDPにバインドして、グリッドを変換し、ポイントの中央に配置します。御馳走をするようです。

于 2012-12-11T18:02:38.330 に答える
0

オブジェクトをそのサイズの半分だけ移動するには、2つの回転またはスケールを使用できます。1つ目は相対ポイント0.25,0.25を超え、2つ目は入力ポイント0.5,0.5を超えます。回転を使用する場合、天使は180度と-180度です。スケールを使用する場合、スケール係数は-1、-1および-1、-1です。RenderTransformOriginプロパティを忘れないでください。また、2つの変換を適用するには、それらを2つのネストされた要素に適用できます。

于 2012-12-13T17:13:26.970 に答える