2017-01-23 40 views
0

我試圖創建一個網格,處理不同大小的屏幕。我的代碼目前看起來是這樣的:MaxWidth的'自動'?

<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> 

這個代碼看上去很完美,當應用程序是全屏,但是當我縮小/調整屏幕的第一列將不縮小以適合。它使我的網格保持相同的大小,這會將我的文本從較小的屏幕推出。

如何限制「自動」大小的寬度,並仍然調整其大小,如'*'?

回答

1

我怎麼能蓋住內對齊文本塊舒展寬度在任何大小「自動」將是,並仍然有它調整大小,如'*'?

根據Define page layouts with XAMLAuto意味着該列將大小以適應其內容,*裝置計算自動列之後,列獲得剩餘的寬度的一部分。

WidthColumnDefinition不能設置爲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值取決於TextBlockWidth。更多詳情請參考official sample

更新的代碼如下,如果的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;   
} 
+0

更接近,但是你在哪裏得到值MinWindowWidth =「600」?由於每個TextBlock的長度可能會有所不同,我永遠不會知道*和Auto之間的確切翻轉點。當它被設置爲Auto時,我不需要'600'作爲第一列的寬度嗎?我不能只將該值設置爲第一列的MaxWidth並獲得相同的結果嗎? –

+0

@TS,'MinWindowWidth'是兩個'TextBlock'的摘要'ActualWidth'。如果實際寬度是動態的,您可以在後面計算代碼並將其設置爲觸發器。我更新了您可以參考的答覆中的代碼。順便說一下,如果我的回覆對您有幫助,請您注意接受。 –

+0

我已經得到了我想要的......儘管我最終放棄了VisualStateManager。基本上我把你的代碼放在後面,而不是用它來設置'adptivetrigger.MinWindowWidth',用它來設置'col1.MaxWidth'。它仍然需要調整才能使它與它所在的ItemsControl一起工作(可能會使MaxWidth成爲一個綁定),但這個概念是可靠的。謝謝! –

0

你可以試試這個一個

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

在這裏,我只是說的Horizo​​ntalAlignment =「拉伸」屬性,將列

+0

沒有好的代碼。如果第一列只有一些文本,那麼每個TextBlock之間仍然存在差距。如果有很多文本,則第一列不會展開以適合文本,即使第二列末尾有一堆空白空間。 –

+0

是否要根據其包含的文本調整第一列的寬度?那麼如果第二列有一些文本,第二列應該發生什麼? –

+0

我想要的是兩列的行爲就好像它們的寬度是自動的,但是當屏幕縮小或者它們的組合文本太大時,只有第一列會縮小或者具有截止文本。第一列的TextBlock具有TextTrimming =「CharacterEllipsis」,以使其適合列,如果它太小。這是因爲第一列包含項目的描述,我可以排除其中的一部分,第二列包含項目的當前狀態,該狀態不應該被隱藏或切斷。我還需要消除這些TextBlock之間的差距。 –