我试图创建一个网格来处理不同大小的屏幕。我的代码当前如下所示:
<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>当应用程序是全屏时,这段代码看起来很完美,但是当我缩小/调整屏幕大小时,第一列将不会收缩以适合。它使我的网格保持相同的大小,从而将我的文本从较小的屏幕上推开。
我怎样才能将宽度限制在“汽车”大小的范围内,并且仍然可以像“*”那样调整宽度?
发布于 2017-01-24 07:43:21
我怎样才能将宽度限制在“汽车”大小的范围内,并且仍然可以像“*”那样调整宽度?
根据用XAML定义页面布局,Auto表示列的大小将与其内容相匹配,*表示在计算Auto列之后,该列将获得部分剩余的宽度。
Width of ColumnDefinition不能设置为Auto和*。但是,由于您的问题是当将Auto设置为两个ColumnDefinition时,它会将文本从较小的屏幕上推开,因此在这里我们可以使用AdaptiveTrigger。默认情况下,我们可以将Width设置为*,这可以确保调整大小不会切断文本。当窗口调整为不会导致文本被切断的较大大小时,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>MinWindowWidth的值取决于TextBlock的总Width。更多细节请参考官方样品。
更新代码如下,如果Width of TextBlock是动态的。
XAML码
<Grid
Background="Azure"
BorderBrush="Pink"
BorderThickness="2">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="col1" Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
x:Name="txt1"
Foreground="Blue"
Text="layouttest1layouttest1layouttest1layou"
TextWrapping="Wrap" />
<TextBlock
Grid.Column="1"
Foreground="Red"
x:Name="txt2"
Text="layouttest2layouttest2layouttest2layouttest2layout"
TextWrapping="Wrap" />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<AdaptiveTrigger x:Name="adptivetrigger" />
</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;
}发布于 2017-01-24 04:50:33
你能试试这个吗?
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" ... HorizontalAlignment="Stretch"/>
<TextBlock Grid.Column="1" ... HorizontalAlignment="Stretch"/>
在这里,我刚刚添加了HorizontalAlignment=“拉伸”属性,它将对齐列中的文本块拉伸。
https://stackoverflow.com/questions/41810350
复制相似问题