3

深刻な問題があり、解決できません。WPF で完全に動作する次のコードがあります。

    <ItemsControl Grid.Row="1" ItemsSource="{Binding GameFields}" HorizontalAlignment="Stretch">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="7" Columns="7" Margin="20" HorizontalAlignment="Center" VerticalAlignment="Center" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Command="{Binding SingleStepCommand}" CommandParameter="{Binding Index}" Visibility="{Binding Visible}" Background="Transparent" 
                        Margin="10" BorderBrush="Transparent" BorderThickness="0">
                    <Button.Content>
                        <Image Source="{Binding IconPath}" Stretch="Fill" />
                    </Button.Content>                            
                </Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Grid.Row" Value="{Binding X}" />
                <Setter Property="Grid.Column" Value="{Binding Y}" />
            </Style>
        </ItemsControl.ItemContainerStyle>            
    </ItemsControl>

そしてWindows Phone(7.1)に実装してみる。しかし、itemspaneltemplate グリッドのすべての要素は互いに、つまり同じ X と Y の位置にあります。これが私が試したことです:

    <ItemsControl x:Name="ContentSource" Grid.Row="1" Margin="12,0,12,0" ItemsSource="{Binding GameFields}" >
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <Grid.RenderTransform>
                        <TransformGroup>
                            <TranslateTransform X="{Binding X}" Y="{Binding Y}" />
                        </TransformGroup>
                    </Grid.RenderTransform>
                </Grid>
            </ItemsPanelTemplate>                
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Command="{Binding SingleStepCommand}" CommandParameter="{Binding Index}" Visibility="{Binding Visible}" Grid.Row="{Binding X}"
                        Grid.Column="{Binding Y}">
                    <Button.Content>
                        <Image Source="{Binding IconPath}" Stretch="Fill" />
                    </Button.Content>
                </Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>             
        <!--ItemsControl.Resources>
            <Style TargetType="ContentPresenter">
                <Setter Property="Grid.Row" Value="17" />
                <Setter Property="Grid.Column" Value="17" />
            </Style>
        </ItemsControl.Resources-->            
    </ItemsControl>

3つの異なる方法があり、どれも機能しません。(リソース、TranslateTransform およびボタン grid.row バインディング)。何を間違っているのか、何を使うべきなのか、何か提案はありますか? MVVM を厳密に使用する必要があるため、コード ビハインドはありません。どんなアドバイスでも、私の英語に感謝し、申し訳ありません:)

4

2 に答える 2

4

ContentPresenter で Grid.Row および Grid.Column プロパティを設定する必要があります。これを行う最も簡単な方法は、それぞれに独自の添付プロパティを使用することです。

このようなもの:

public class ItemsGridLayout
{
    public static int GetGridRow(DependencyObject obj)
    {
        return (int)obj.GetValue(GridRowProperty);
    }

    public static void SetGridRow(DependencyObject obj, int value)
    {
        obj.SetValue(GridRowProperty, value);
    }

    // Using a DependencyProperty as the backing store for GridRow.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty GridRowProperty =
        DependencyProperty.RegisterAttached("GridRow", typeof(int), typeof(FrameworkElement), new PropertyMetadata(0, (s, e) =>
        {
            var presenter = GetItemsPresenter(s);
            if (presenter != null)
            {
                Grid.SetRow(presenter, GetGridRow(s));
            }
        }));

    public static int GetGridColumn(DependencyObject obj)
    {
        return (int)obj.GetValue(GridColumnProperty);
    }

    public static void SetGridColumn(DependencyObject obj, int value)
    {
        obj.SetValue(GridColumnProperty, value);
    }

    // Using a DependencyProperty as the backing store for GridColumn.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty GridColumnProperty =
        DependencyProperty.RegisterAttached("GridColumn", typeof(int), typeof(FrameworkElement), new PropertyMetadata(0, (s, e) =>
        {
            var presenter = GetItemsPresenter(s);
            if (presenter != null)
            {
                Grid.SetColumn(presenter, GetGridColumn(s));
            }
        }));

    static FrameworkElement GetItemsPresenter(DependencyObject target)
    {
        while (target != null)
        {
            if (target is ContentPresenter)
            {
                return target as FrameworkElement;
            }
            target = VisualTreeHelper.GetParent(target);
        }
        return null;
    }
}

次に、XAML では次のように使用されます。

<ItemsControl>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button local:ItemsGridLayout.GridRow="{Binding X}" 
                    local:ItemsGridLayout.GridColumn="{Binding Y}" 
于 2013-03-05T19:05:16.617 に答える
1

今日、まったく同じ問題に遭遇しました。WPF の後で Silverlight を学習したので、これが機能しないとは思っていませんでした。

この種の回避策を回避するためにさらにいくつかの検索を行った後、Styleリソースを追加しようとしましたContentPresenterが、Silverlight 5 ではうまく機能しました。

    <ItemsControl ItemsSource="{Binding Source={StaticResource CVM}, Path=PagedItems}">
        <ItemsControl.Resources>
            <Style TargetType="ContentPresenter">
                <Setter Property="Grid.Column" Value="{Binding OffsetX}"/>
                <Setter Property="Grid.Row" Value="{Binding OffsetY}"/>
            </Style>
        </ItemsControl.Resources>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        ...
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        ...
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
于 2014-09-25T12:38:37.800 に答える