2016-05-18 106 views
2

我有一个包含两个元素的网格,一个缩放视图框和一个Textblock。我希望Viewbox只占用它所需的空间,但也只能占用空间。UWP XAML:用2个元素填充屏幕,一个Viewbox

图片说明它要好得多,所需的图像第一:
The way I want it to work
然而,当我调整我的应用是广泛的,视框开始超越它下面的文本块:
The Viewbox overtaking the Textblock

这里有一个我的XAML的简单化版本:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" x:Name="MainGrid" Margin="0" UseLayoutRounding="False"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="0" /> 
    </Grid.ColumnDefinitions> 

    <Viewbox Stretch="Uniform" VerticalAlignment="Top" HorizontalAlignment="Left" Grid.Row="0" x:Name="Zulrah"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition /> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 

      <Rectangle Grid.Column="0" Fill="Blue" Width="150" Height="250" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
      <Rectangle Grid.Column="1" Fill="Red" Width="150" Height="250" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
     </Grid> 
    </Viewbox> 
    <TextBlock Grid.Row="1" x:Name="TextOutput" MinHeight="100" MinWidth="100"> 
     Hello world! 
     <LineBreak /> 
     Life's good 
    </TextBlock> 
</Grid> 

您可以或多或少地忽略第二个栏(与宽度=“0”),它是用来当APPLICAT离子变成宽屏幕(或风景)。它具有相同的问题:
The same issue happens when entering 'portrait' mode

总之:我想将TextBlock服从它了minHeight =“100”,同时还可以提高视框中使用的空间。

PS:请注意,某些设置会使Viewbox缩放比实际适合屏幕更大的尺寸,这不是理想的!

编辑:值得注意的是,设置了minHeight =“100”在第二行有没有效果...

+0

设置已固定或MainGrid百分率值高度第二行是不适合你? – Eins

+0

这样做的结果浪费在这样的空间:http://puu.sh/oXckj.png在某些窗口大小。 – ManIkWeet

回答

3

由于您使用的是你的代码ThemeResource,我认为你正在开发一个应用程序UWP作为有在WPF中不是ThemeResource。如果是这样,请删除标题和标签中的WPF,因为它们是两个不同的框架。 UWP和WPF的混合使用可能会导致混淆。

对于UWP应用程序,在Grid中,虽然将行的高度设置为自动,但该行的大小将适合其内容。自动行计算后,高度设置为*的行将获得剩余高度的一部分。

根据您的描述,您需要TextBlock服从它的MinHeightViewbox获得剩余高度的一部分。所以,你可以改变RowDefinitions类似以下内容:

<Grid.RowDefinitions> 
    <RowDefinition Height="*" /> 
    <RowDefinition Height="Auto" /> 
</Grid.RowDefinitions> 

并使Viewbox填充剩余的区域,我们可以设置VerticalAlignmentHorizontalAlignmentStretch。除此之外,您还可能需要将Stretch属性设置为Fill以使Viewbox中的内容调整大小以填充目标维度。

完整的XAML代码可能会喜欢以下内容:

<Grid x:Name="MainGrid" 
     Margin="0" 
     Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
     UseLayoutRounding="False"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="0" /> 
    </Grid.ColumnDefinitions> 

    <Viewbox x:Name="Zulrah" 
      Grid.Row="0" 
      AllowDrop="True" 
      Stretch="Fill"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition /> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 

      <Rectangle Grid.Column="0" 
         Width="150" 
         Height="250" 
         HorizontalAlignment="Stretch" 
         VerticalAlignment="Stretch" 
         Fill="Blue" /> 
      <Rectangle Grid.Column="1" 
         Width="150" 
         Height="250" 
         HorizontalAlignment="Stretch" 
         VerticalAlignment="Stretch" 
         Fill="Red" /> 
     </Grid> 
    </Viewbox> 
    <TextBlock x:Name="TextOutput" 
       Grid.Row="1" 
       MinWidth="100" 
       MinHeight="100"> 
     Hello world! 
     <LineBreak /> 
     Life's good 
    </TextBlock> 
</Grid> 
+0

将第一行从“自动”更改为*将导致Viewbox占用大量未使用的空间(图像中为绿色),我希望Textblock(图像中的黄金)占用的空间。如果实际使用ViewBox,我只想让Viewbox参考其余高度的一部分。Viewbox不需要比Auto更多的空间,但它不遵守MinHeight。 http://imgur.com/58jFwKe – ManIkWeet

+0

@ManIkWeet,如果你将第一行的高度设置为'Auto',你的'TextBlock'实际上会服从'MinHeight'。如果您使用** Live Property Explorer **查看“TextBlock”的“RenderSize”,即使您看不到像[此图片](http:// i)那样的“TextBlock”,它仍然是“* x100” .stack.imgur.com/6Dit1.png)。 “TextBlock”没有完全显示,因为窗户的高度不够大。如果你希望'Viewbox'不会占用更多的空间,你可以尝试在'Viewbox'中设置'StretchDirection =“DownOnly”'。 –

+0

与你的指示我明白了,谢谢。 – ManIkWeet