これにはいくつかの答えがありますが、いずれも UWP では機能せず、WPF でのみ機能します。子のそれぞれのビュー モデル内のプロパティに基づいて、その子を通常とは異なるパターンで動的に配置するカスタムの ItemsControl があります。アイテムが部分的に重複しているため、選択したアイテムが他のアイテムの下に隠れていないことを確認する必要があります。しかし、値をグリッドの Z-index にバインドする方法がわかりません。
<ItemsControl Name="myItemsControl" ItemsSource="{x:Bind PageViewModel.myCollectionOfMyViewModel}" RenderTransformOrigin="0.5,0.5" >
<ItemsControl.RenderTransform>
<CompositeTransform x:Name="myTransform" />
</ItemsControl.RenderTransform>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="viewmodel:MyViewModel">
<Grid Name="ItemGrid" Canvas.ZIndex="{x:Bind SelectedItem, Mode=OneWay, Converter={StaticResource SelectedItemToZindexConverter}}" RenderTransformOrigin="0.5,0.5" >
<Grid.RenderTransform>
<CompositeTransform Rotation="{Binding ItemIdxNum, Mode=OneWay, Converter={StaticResource ItemIdxToRotationAngleConverter}}"
TranslateX="{Binding ItemIdxNum, Mode=OneWay, Converter={StaticResource ItemIdxToXPosConverter}}"
TranslateY="{Binding ItemIdxNum, Mode=OneWay, Converter={StaticResource ItemIdxToYPosConverter}}"
ScaleX="{x:Bind SelectedItem, Mode=OneWay, Converter={StaticResource SelectedItemBoolToScaleConverter}}"
ScaleY="{x:Bind SelectedItem, Mode=OneWay, Converter={StaticResource SelectedItemBoolToScaleConverter}}"
/>
</Grid.RenderTransform>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Bind ItemName, Mode=OneWay}"/>
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
そこにある Canvas.Zindex はビルド エラーをスローしませんが、機能しません。ここや他の場所で検索すると、子要素ではなく、ItemsControl の ContentPresenter をターゲットにする必要があるようです。しかし、私はこれについてどうやって行くのか分かりません。すべての例は WPF 用であり、UWP では使用できないスタイル トリガー ターゲット タイプを使用します。
タイプミスのようです。の首都I
ですZIndex
。
Canvas.ZIndex="..." <!-- right -->
Canvas.Zindex="..." <!-- wrong -->
更新
ItemsControl
はすべてのアイテムを でラップしますContentPresenter
が、独自のバージョンを作成することでその機能をオーバーライドできます。次の代わりにこれを使用しますItemsControl
。
public class MyItemsControl : ItemsControl
{
protected override DependencyObject GetContainerForItemOverride()
{
return ItemTemplate?.LoadContent() ?? base.GetContainerForItemOverride();
}
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
((FrameworkElement) element).DataContext = item;
}
}
そして、あなたのxamlは、ルートレベルのタグを次のように切り替えるだけでこれを使用できます MyItemsControl
<local:MyItemsControl Name="myItemsControl"
ItemsSource="{x:Bind PageViewModel.myCollectionOfMyViewModel}"
RenderTransformOrigin="0.5,0.5">
<ItemsControl.RenderTransform>
<CompositeTransform x:Name="myTransform" />
</ItemsControl.RenderTransform>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="viewmodel:MyViewModel">
<Grid Name="ItemGrid"
Canvas.ZIndex="{x:Bind SelectedItem, Mode=OneWay, Converter={StaticResource SelectedItemToZindexConverter}}"
RenderTransformOrigin="0.5,0.5">
<Grid.RenderTransform>
<CompositeTransform Rotation="{Binding ItemIdxNum, Mode=OneWay, Converter={StaticResource ItemIdxToRotationAngleConverter}}"
TranslateX="{Binding ItemIdxNum, Mode=OneWay, Converter={StaticResource ItemIdxToXPosConverter}}"
TranslateY="{Binding ItemIdxNum, Mode=OneWay, Converter={StaticResource ItemIdxToYPosConverter}}"
ScaleX="{x:Bind SelectedItem, Mode=OneWay, Converter={StaticResource SelectedItemBoolToScaleConverter}}"
ScaleY="{x:Bind SelectedItem, Mode=OneWay, Converter={StaticResource SelectedItemBoolToScaleConverter}}" />
</Grid.RenderTransform>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Bind ItemName, Mode=OneWay}" />
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</local:MyItemsControl>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加