Viewbox 里面只能包含方形 Grid 吗?

Posted

技术标签:

【中文标题】Viewbox 里面只能包含方形 Grid 吗?【英文标题】:Can the Viewbox only contain square Grid inside of it? 【发布时间】:2017-11-30 13:55:19 【问题描述】:

我只想知道 Viewbox 是否只能包含方形网格等 Squre 元素? Viewbox 可以包含矩形网格吗?

我的问题原因: 我正在尝试将矩形 Grid 放置到 Viewbox 控件中,但是当我这样做时,它会在视图框中从上侧和下侧留下额外的边距,以使元素成为方形。

我的代码:

<ListView Grid.Row="9"
                     x:Name="lstView"
                     CanDragItems="True"
                     ItemsSource="Binding Details.data"
                     ItemTemplate="StaticResource lvTemplate"
                     Style="StaticResource HorizontalWrapView" />

------------------------------------

<DataTemplate x:Key="lvTemplate">
    <Viewbox>
        <Grid Margin="10 0" Height="120" Width="170" Background="Gray">
            <Grid >
                <TextBlock Text="abc"
                           Style="StaticResource TileOverlay" />
            </Grid>
        </Grid>
    </Viewbox>
</DataTemplate>

---------------------------------------------------------------

<Style x:Key="HorizontalWrapView"
       TargetType="ListView">
    <Setter Property="Template"
            Value="StaticResource ListViewNoScroll" />
    <Setter Property="ItemsPanel"
            Value="StaticResource HorizontalWrapPanel" />
    <Setter Property="SelectionMode"
            Value="None" />
    <Setter Property="IsItemClickEnabled"
            Value="True" />
    <Setter Property="MaxWidth"
            Value="StaticResource MaxContentWidth" />
</Style>

-----------------------------------------------

<ControlTemplate x:Key="ListViewNoScroll">
    <ItemsPresenter />
</ControlTemplate>

------------------------------------------------
<ItemsPanelTemplate x:Key="HorizontalWrapPanel">
    <WrapGrid Orientation="Horizontal"
              Margin="StaticResource ListMargin" />
</ItemsPanelTemplate>

输出:

这个 dataTemplate 是具有 WrapGrid 样式的列表视图。每个网格都在一个单独的视图框中。

【问题讨论】:

我已经测试了您的代码,但无法重现您的问题。包含矩形网格的视图框在我这边没有拉伸为正方形。您能否提供有关您的代码的更多详细信息,例如WrapGrid 的样式。 我已经添加了所有与listview相关的代码sn-ps。请检查并帮助我。我想使网格成为矩形,上下没有多余的边距。 【参考方案1】:

您使用了DataTemplate,这意味着您正在尝试使用项目控件(ListViewGridView)显示数据。您面临的问题不是视图框问题。这是ItemsContainer 问题。这里的问题是ItemsContainer 接受DataTemplate 并排列来自ItemSource 的所有项目并以相同的格式排列它们(由ItemsWrapPanel 处理)


如何解决这样的问题?

您只需向您的ItemsControl 提供VariableSizedGrid。我将考虑listview,但GridView 可能会为您提供您可能感兴趣的渲染类型,只需将ListView 替换为GridView,您就会坚如磐石。下面是代码:

 <ListView.ItemsPanel>
     <ItemsPanelTemplate>
         <!-- 
         or you can do this if you want horizontal scrolling
         <VariableSizedWrapGrid Orientation="Horizontal"/>
         -->
         <VariableSizedWrapGrid/>
     </ItemsPanelTemplate>
 </ListView.ItemsPanel>
 <ListView.GroupStyle>
     <GroupStyle>
         <GroupStyle.Panel>
             <ItemsPanelTemplate>
                  <VariableSizedWrapGrid ItemHeight="250" ItemWidth="250" Margin="10"/>
             </ItemsPanelTemplate>
         </GroupStyle.Panel>
     </GroupStyle>
 </ListView.GroupStyle>

我在上面的代码中做了什么?

除了提供ItemsControl (ListView) 来使用VariableSizedWrapPanel 来托管或呈现您的DataTemplate 之外,我什么也没做。因此,通过这种方式,您的数据将重新排列,以适应您提供的或自适应实现的大小的整个区域。

编辑 - 1

在问题中更新代码后,您使用我提供的解决方案的最终代码将如下所示:

<ListView Grid.Row="9" x:Name="lstView" CanDragItems="True" ItemTemplate="StaticResource lvTemplate" ItemsSource="Binding Details.data" Style="StaticResource HorizontalWrapView" >
                    <ListView.ItemsPanel>
                        <ItemsPanelTemplate>
                            <VariableSizedWrapGrid/>
                        </ItemsPanelTemplate>
                    </ListView.ItemsPanel>
                    <ListView.GroupStyle>
                        <GroupStyle>
                            <GroupStyle.Panel>
                                <ItemsPanelTemplate>
                                    <VariableSizedWrapGrid ItemHeight="250" ItemWidth="250" Margin="10"/>
                                </ItemsPanelTemplate>
                            </GroupStyle.Panel>
                        </GroupStyle>
                    </ListView.GroupStyle>
                </ListView>

请注意:我将 Visual Studio 2017 用于面向 Windows 最低版本 10240 的 UWP 环境


编辑 - 2

我实际上只是用谷歌搜索了这个问题,发现ListView 不支持VariableSizedWrapPanel。您需要改用 GridView。有关这方面的更多信息,请访问 MSDN 上的 This Thread。

因此,您可以切换到GridView,您的问题将得到解决。

请注意:为了使代码正常工作,请将ListView 替换为GridView,您将能够看到您想要的结果。

【讨论】:

哦,伙计,您的解决方案看起来很有希望.. 立即检查,我会在一段时间内告诉您我从中得到了什么.. 无论如何,谢谢.. 我在使用“VariableSizedWrapGrid”时遇到错误:未指定的错误。您用于控件的面板不允许作为控件的 ItemsPanel。 你用的是什么ItemsControl? 请重新检查问题。我已经添加了与 listview 相关的所有代码,请帮忙,我想制作网格矩形,上下边没有额外的边距。 在某些时候尝试一下,但同时您能告诉我为什么您使用的是 GroupStyle 吗?我想要一个矩形网格,所以 ItemHeight 和 ItemWidth 等于 250 将使它成为一个正方形。不是吗?

以上是关于Viewbox 里面只能包含方形 Grid 吗?的主要内容,如果未能解决你的问题,请参考以下文章

WPF 窗口放大缩小控件也跟着放大缩小最好跟网页一样,除了用Viewbox空间

将外部 Viewbox 导入到 UserControl

WPF GroupBox 里面不能添加两个Button 的问题

StackPanel 内的 WPF ViewBox

C#里winform最大化时,如何使里面的控件按比例变化

P1681 最大正方形II (动态规划)