Uwp 最大宽度为';自动';?

Uwp 最大宽度为';自动';?,uwp,uwp-xaml,Uwp,Uwp Xaml,我正在尝试创建一个网格来处理不同大小的屏幕。我的代码当前如下所示: <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" ... /&g

我正在尝试创建一个网格来处理不同大小的屏幕。我的代码当前如下所示:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Column="0" ... />
    <TextBlock Grid.Column="1" ... />
</Grid>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Column="0" ... />
    <TextBlock Grid.Column="1" ... />
</Grid>

这不能正常工作,因为当我全屏显示时,第一列的末尾有一个巨大的空白,我希望每列中的文本相邻。但是,当我收缩/调整屏幕大小时,它确实正确地收缩了第一列

我还尝试使用如下代码:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Column="0" ... />
    <TextBlock Grid.Column="1" ... />
</Grid>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Column="0" ... />
    <TextBlock Grid.Column="1" ... />
</Grid>

当应用程序全屏显示时,此代码看起来非常完美,但当我缩小/调整屏幕大小时,第一列将不会缩小以适合。它使我的网格保持相同的大小,从而将我的文本从较小的屏幕上推出

如何将宽度限制在“Auto”的任何大小,并且仍然将其调整为“*”?

您能试试这个吗

<Grid>
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" ... HorizontalAlignment="Stretch"/>
<TextBlock Grid.Column="1" ... HorizontalAlignment="Stretch"/>

在这里,我刚刚添加了HorizontalAlignment=“Stretch”属性,该属性将在列中对齐textblock Stretch

我如何将宽度限制为“Auto”的大小,并且仍然将其调整为“*”大小

根据,
Auto
表示列的大小将适合其内容,
*
表示在计算自动列后,列将获得剩余宽度的一部分

列定义的
宽度
不能设置为
自动
,也不能设置为
*
。但由于您的问题是将
Auto
同时设置为
ColumnDefinition
,它会将您的文本从较小的屏幕上推出,因此我们可以在这里使用。默认情况下,我们可以将宽度设置为
*
,这样可以确保调整大小不会切断文本。当窗口的大小调整到不会导致文本被截断的较大尺寸时,
AdaptiveTrigger
可以帮助将
Width
属性从
*
更改为
Auto
。例如:

<Grid
   Background="Azure"
   BorderBrush="Pink"
   BorderThickness="2">
   <Grid.ColumnDefinitions>
       <ColumnDefinition x:Name="col1" Width="*" />
       <ColumnDefinition Width="Auto" />
   </Grid.ColumnDefinitions>
   <TextBlock        
       Grid.Column="0"        
       Foreground="Blue"
       Text="layouttest1layouttest1layouttest1layou"
       TextWrapping="Wrap"  />
   <TextBlock     
       Grid.Column="1"           
       Foreground="Red"
       Text="layouttest2layouttest2layouttest2layouttest2layout"
       TextWrapping="Wrap" />
   <VisualStateManager.VisualStateGroups>
       <VisualStateGroup>
           <VisualState>
               <VisualState.StateTriggers>
                   <AdaptiveTrigger MinWindowWidth="600" />
               </VisualState.StateTriggers>
               <VisualState.Setters>
                   <Setter Target="col1.Width" Value="Auto" />
               </VisualState.Setters>
           </VisualState>
       </VisualStateGroup>
   </VisualStateManager.VisualStateGroups>
</Grid>
代码隐藏

 private void Page_Loaded(object sender, RoutedEventArgs e)
 {
     var testwidth = txt1.ActualWidth + txt2.ActualWidth;
     adptivetrigger.MinWindowWidth = testwidth;          
 }

无益。如果第一列只有少量文本,则每个文本块之间仍有间隙。如果有大量文本,则第一列将不会展开以适合文本,即使第二列末尾有一堆空白。是否要根据第一列包含的文本调整第一列的宽度?那么,如果第二列有一些文本,那么第二列会发生什么情况呢?我想让两列都像它们的宽度是自动的一样,但是当屏幕缩小或它们的组合文本太大时,只有第一列会缩小或有截断文本。第一列的TextBlock具有TextTrimming=“CharacterEllipsis”,以便在列太小时使其适合该列。这是因为第一列包含一个项目的描述,我可以排除其中的一部分,而第二列包含一个项目的当前状态,它不应该被隐藏或切断。我还需要消除这些文本块之间的任何间隙。更近,但您从哪里获得值MinWindowWidth=“600”?由于每个文本块的长度可能不同,我永远不知道*和Auto之间的确切翻转点。当第一列设置为“自动”时,我不需要“600”作为第一列的宽度吗?我不能将该值设置为第一列的MaxWidth并获得相同的结果吗?@TS,
MinWindowWidth
是两个
TextBlock
的摘要
ActualWidth
。如果实际宽度是动态的,您可以计算它的代码并将其设置为触发器。我在回复中更新了代码,你可以参考。顺便说一句,如果我的回答对你有帮助,你能标记为接受吗?我已经得到了我想要的。。。虽然我最终放弃了经理。基本上我把你的代码放在后面,用它来设置“col1.MaxWidth”,而不是用它来设置“adptivetrigger.MinWindowWidth”。它仍然需要调整以使其与它所在的ItemsControl一起工作(可能使MaxWidth成为绑定),但这个概念是可靠的。非常感谢。