Элементы сетки в виде квадратов в WinRT (метро)

Я боролся с этим несколько дней и не могу заставить его работать. Может быть, я не такой хороший программист на XAML, как я надеялся

В любом случае, моя проблема в том, что я хочу привязать несколько элементов к GridView и заставить их отображаться в виде квадратов без установки ширины и высоты. Причина этого заключается в том, что я хочу, чтобы мои элементы GridView увеличивались / уменьшались и расширялись до максимального размера при изменении разрешения или размера экрана.

Вот мой XAML:

<UserControl.Resources>

    <Style x:Key="MyItemContainerStyle" TargetType="ListViewItem">
        <Setter Property="FontFamily" Value="Segoe UI" />
        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="VerticalContentAlignment" Value="Stretch" />
        <!--<Setter Property="Height" Value="{Binding RelativeSource={RelativeSource Self}, Path=Width}" />-->
    </Style>

    <DataTemplate x:Key="MyItemTemplate">
        <Border CornerRadius="4" 
                BorderBrush="Black"  
                BorderThickness="1"
                Background="Blue">
            <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">X</TextBlock>
        </Border>
    </DataTemplate>

    <ItemsPanelTemplate x:Key="MyItemsPanelTemplate">
        <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </ItemsPanelTemplate>

</UserControl.Resources>

<Grid Background="White">
    <GridView x:Name="MyGrid"
              UseLayoutRounding="True"
              ItemTemplate="{StaticResource MyItemTemplate}"
              ItemsPanel="{StaticResource MyItemsPanelTemplate}"
              ItemContainerStyle="{StaticResource MyItemContainerStyle}"
              ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto">
    </GridView>
</Grid>

И это мой код:

public sealed partial class BlankPage : Page
{
    public BlankPage()
    {
        this.InitializeComponent();

        MyGrid.Items.Add(new ListViewItem { Content = 1 });
        MyGrid.Items.Add(new ListViewItem { Content = 2 });
        MyGrid.Items.Add(new ListViewItem { Content = 3 });
    }

    /// <summary>
    /// Invoked when this page is about to be displayed in a Frame.
    /// </summary>
    /// <param name="e">Event data that describes how this page was reached.  The Parameter
    /// property is typically used to configure the page.</param>
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
    }
}

Это, однако, приводит к выводу, как это (прямоугольные элементы, а не квадраты)

Ouput

Я был бы признателен, если бы кто-то, кто знает немного больше о разработке XAML и WinRT (metro), чем я, смог бы объяснить это для меня и, возможно, привести мне рабочий пример.

Thanx!

РЕДАКТИРОВАТЬ

Я получил подсказку, чтобы обернуть мою Границу в Viewbox, поскольку у нее, кажется, есть некоторые способности масштабирования / растяжения.

Я играл около пары часов, но не могу заставить его работать на все 100%.

Это мой XAML сейчас:

<UserControl.Resources>

<Style x:Key="MyItemContainerStyle" TargetType="ListViewItem">
    <Setter Property="FontFamily" Value="Segoe UI" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Stretch" />
</Style>

<DataTemplate x:Key="MyItemTemplate">
    <Viewbox>
        <Border CornerRadius="3" 
        BorderBrush="Black"  
        BorderThickness="1">
            <Grid Background="Blue" MinHeight="50" MinWidth="50">
                <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">X</TextBlock>
            </Grid>
        </Border>
    </Viewbox>
</DataTemplate>

<ItemsPanelTemplate x:Key="MyItemsPanelTemplate">
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
    </StackPanel>
</ItemsPanelTemplate>

</UserControl.Resources>

<Grid Background="White">
    <GridView x:Name="MyGrid"
      UseLayoutRounding="True"
      ItemTemplate="{StaticResource MyItemTemplate}"
      ItemsPanel="{StaticResource MyItemsPanelTemplate}"
      ItemContainerStyle="{StaticResource MyItemContainerStyle}"
      ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled">
    </GridView>
</Grid>

Это производит этот вывод:

output2

Теперь он, кажется, растянулся на квадрат, но вытянулся за пределы экрана. Я также запустил этот пример для нескольких результатов и размеров экрана, и он показывает тот же результат, что означает, что он масштабируется правильно.

Помощь будет оценена.

Thanx!

1 ответ

Ваша закомментированная привязка близка к чему-то, что могло бы работать - только вам нужно привязать к ActualWidth:

<Setter Property="Height" Value="{Binding ActualWidth, RelativeSource={RelativeSource Self}}" />

В целом, я бы предложил использовать жестко запрограммированные значения - они упрощают компоновку ЦП, упрощают детерминированный дизайн и масштабируются Windows, когда этого требуют размер и разрешение экрана. Если вам нужен больший контроль над этим, вы можете привязать ширину и высоту к одному и тому же значению из модели представления, которую вы меняете в зависимости от необходимости, или написать преобразователь, который преобразует жестко запрограммированное значение ширины / высоты в фактическое значение в зависимости от обнаруженного экрана. размер / разрешение или настройки.

Другие вопросы по тегам