2017-01-23 2 views
0

Ich versuche, ein Raster zu erstellen, das mit Bildschirmen unterschiedlicher Größe arbeitet. Mein Code sieht derzeit wie folgt aus:MaxWidth von 'Auto'?

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

Dies funktioniert nicht richtig, weil ich mit einem riesigen leeren Raum am Ende am Ende der ersten Spalte, wenn ich im Vollbild bin, und ich mag den Text in jedem Spalte, um benachbart zu sein. Es schrumpft die erste Spalte jedoch korrekt, wenn ich den Bildschirm verkleinern/vergrößern möchte.

Ich habe auch versucht, Code wie folgt verwendet:

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

Dieser Code sieht perfekt aus, wenn die Anwendung Vollbild ist, aber wenn ich den Bildschirm die erste Spalte passen nicht schrumpfen/die Größe schrumpfen. Es lässt mein Raster gleich groß, was meinen Text vom kleineren Bildschirm wegdrückt.

Wie kann ich die Breite in welcher Größe auch immer 'Auto' begrenzen, und immer noch die Größe ändern, wie es '*' ist?

Antwort

1

Wie ausrichten kann ich die Kappe Breite in welcher Größe auch immer 'Auto' wäre, und habe immer noch die Größe wie '*'?

Nach Define page layouts with XAML bedeutet Auto die Spalte Größe sein Inhalt zu passen, * bedeutet, nachdem die Auto Spalten berechnet werden, wobei die Säule ein Teil der verbleibenden Breite erhält.

Width von ColumnDefinition kann nicht auf Auto sowie * eingestellt werden. Aber als Ihr Problem ist, wenn gesetzt Auto zu beiden ColumnDefinition, schiebt es Ihren Text von der kleineren Bildschirm, so dass wir hier AdaptiveTrigger verwenden können. Wir können Width standardmäßig auf * setzen Dies kann sicherstellen, dass die Größe nicht den Text abgeschnitten. Wenn das Fenster zu einer größeren Größe wird, die den Text nicht abschneiden wird, kann AdaptiveTrigger dazu beitragen, die Width-Eigenschaft von * zu Auto zu ändern. Zum Beispiel:

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

Der Wert von MinWindowWidth abhängig von der Gesamt Width von TextBlock. Weitere Details entnehmen Sie bitte der official sample.

Aktualisierter Code wie folgt, wenn Width von TextBlock dynamisch ist.

XAML-Code

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

-Code hinter

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

Näher, aber wo haben Sie den Wert MinWindowWidth = "600" erhalten? Da die Länge jedes TextBlocks variieren kann, werde ich nie den genauen Wendepunkt zwischen * und Auto kennen. Brauche ich nicht 600 als Breite der ersten Spalte, wenn es als Auto eingestellt ist? Und konnte ich diesen Wert nicht als MaxWidth der ersten Spalte festlegen und dieselben Ergebnisse erzielen? –

+0

@TS, Die 'MinWindowWidth' ist die Zusammenfassung' ActualWidth' der beiden 'TextBlock'. Wenn die tatsächliche Breite dynamisch ist, können Sie den Code dahinter berechnen und als Auslöser festlegen. Ich habe den Code in der Antwort aktualisiert, auf die Sie verweisen können. Übrigens, wenn meine Antwort Ihnen helfen würde, könnten Sie bitte als akzeptiert markieren. –

+0

Ich habe, was ich wollte ... obwohl ich den VisualStateManager fallen gelassen habe. Im Grunde nahm ich Ihren Code-Behind und, anstatt es zu verwenden, um 'adptivetrigger.MinWindowWidth' zu setzen, benutzte es, um 'col1.MaxWidth' zu setzen. Es muss noch optimiert werden, damit es mit dem ItemsControl funktioniert, in dem es sich befindet (wahrscheinlich macht MaxWidth eine Bindung), aber das Konzept ist solide. Vielen Dank! –

0

können Sie versuchen, dieses

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

Hier habe ich nur noch Horizontal = "Stretch" Eigenschaft, die TextBlock- Strecke innerhalb der Säule

+0

nicht gut. Wenn die erste Spalte nur wenig Text enthält, gibt es immer noch eine Lücke zwischen den TextBlocks.Wenn viel Text vorhanden ist, wird die erste Spalte nicht so erweitert, dass sie in den Text passt, selbst wenn am Ende der zweiten Spalte eine Menge leerer Leerzeichen steht. –

+0

Möchten Sie die Breite der ersten Spalte entsprechend dem enthaltenen Text anpassen? Was sollte dann mit der zweiten Spalte passieren, wenn die zweite Spalte etwas Text enthält? –

+0

Was ich will ist, dass beide Spalten so tun, als ob ihre Breite automatisch ist. ABER wenn der Bildschirm schrumpft oder der kombinierte Text zu groß ist, wird nur die erste Spalte geschrumpft oder hat abgeschnittenen Text. Der TextBlock der ersten Spalte hat TextTrimming = "CharacterEllipsis", damit er in die Spalte passt, wenn sie zu klein ist. Dies liegt daran, dass die erste Spalte eine Beschreibung eines Projekts enthält, von der ich einen Teil ausschließen kann, und die zweite Spalte den aktuellen Status eines Projekts enthält, das niemals ausgeblendet oder abgeschnitten werden sollte. Ich muss auch jede Lücke zwischen diesen TextBlocks beseitigen. –