【问题标题】:Gridview items as squares in WinRT (metro)Gridview 项目在 WinRT (metro) 中显示为正方形
【发布时间】:2012-03-29 19:21:58
【问题描述】:

我已经为此苦苦挣扎了几天,无法让它发挥作用。 也许我不像我希望的那样优秀的 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)
    {
    }
}

然而,这会产生这样的输出(矩形项目,而不是正方形):

如果有人比我更了解 XAML 和 WinRT (metro) 开发,我将不胜感激,可以为我解释这一点,并可能给我一个工作示例。

谢谢!

编辑

我得到了将我的边框包裹在 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>

这会产生这个输出:

现在它似乎将自己拉伸成一个正方形,但它会在屏幕之外拉伸自己。我还在几个分辨率和屏幕尺寸下运行了这个示例,它显示了相同的输出,这意味着它可以正确缩放。

我们将不胜感激。

谢谢!

【问题讨论】:

    标签: xaml gridview windows-runtime microsoft-metro


    【解决方案1】:

    您注释掉的绑定接近可以工作的东西 - 只有您需要绑定到 ActualWidth:

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

    总的来说,我建议使用硬编码值 - 它们使 CPU 上的布局更容易,更易于确定性设计,并且在屏幕尺寸和分辨率需要时由 Windows 进行缩放。如果您想对此进行更多控制 - 您可以将 Width 和 Height 绑定到视图模型中的相同值,您可以根据需要更改该值,或者编写一个转换器,根据检测到的屏幕将硬编码的 Width/Height 值转换为实际值尺寸/分辨率或设置。

    【讨论】:

    • 感谢您的快速回复。但是,高度的属性绑定不起作用,无论是宽度还是实际宽度(这就是它被注释掉的原因)。 Windows 8 将根据给定的分辨率调整元素的大小,但如果我获得更大的屏幕(具有相同的分辨率),则不会调整它们的大小。这对我来说是合乎逻辑的,因为如果我指定我的 Squares 应该是 50x50px,那么无论屏幕大小如何,它们都将保持不变,因为像素的总量是相同的。如果您在 VS11 中运行内置的平板电脑模拟器,您将看到这一点。 ........
    • 我可以将我的 Height 和 Width 值保存在 ViewModel 中,并有一个转换器可以根据屏幕大小根据需要转换这些值。但这是我试图避免的。首先,我不喜欢在我的 ViewModels 中有 GUI 逻辑(它属于 View)。其次,我应该适应多少屏幕尺寸?这将是一个凌乱的转换器。我想要的只是我的方块尽可能地扩大。而且,有人可以向我解释为什么它们是矩形的吗?这是 GridView 的内置样式吗?我认为至少他们会在屏幕上伸展自己?是什么限制了他们?
    • 你不需要在 vm 中有转换器输入,你可以在 XAML 中明确指定它们。
    • 对于不同的屏幕尺寸和一些需要维护的东西难道不是还有很多“设置”吗?我宁愿有一些没有这个也能工作的东西。
    • 好吧,你必须决定是让 WinRT 为你扩展,还是尝试用你自己的方法覆盖它......你可能应该读到这个:blogs.msdn.com/b/b8/archive/2012/03/21/…
    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多