Frage

Dies scheint, wie es sollte einfach sein, aber ich bin ratlos. In WPF, würde ich einen Text mag, die der Breite erstreckt sich davon Eltern, aber nur bis zu einer maximalen Breite. Das Problem ist, dass ich es will innerhalb der übergeordneten gerechtfertigt gelassen werden. Um es zu strecken Sie Horizontal = „Stretch“, aber dann wird das Ergebnis zentriert verwenden. Ich habe mit experimentiert Horizontalcontentalignment, aber es scheint nicht, etwas zu tun.

Wie bekomme ich dieses blaue Textfeld mit der Größe des Fensters zu wachsen, habe eine maximale Breite von 200 Pixeln und gerechtfertigt gelassen werden?

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel>  
    <TextBox Background="Azure" Text="Hello" HorizontalAlignment="Stretch" MaxWidth="200" />
  </StackPanel>
</Page>

Was ist der Trick?

War es hilfreich?

Lösung

Sie können HorizontalAlignment nach links, stellen Sie Ihren MaxWidth gesetzt und dann Width zum ActualWidth des Elternelements binden:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel Name="Container">   
    <TextBox Background="Azure" 
    Width="{Binding ElementName=Container,Path=ActualWidth}"
    Text="Hello" HorizontalAlignment="Left" MaxWidth="200" />
  </StackPanel>
</Page>

Andere Tipps

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" MaxWidth="200"/>
    </Grid.ColumnDefinitions>

    <TextBox Background="Azure" Text="Hello" />
</Grid>

Beide Antworten gegeben für das Problem habe ich gesagt - Dank

In meiner realen Anwendung aber ich habe versucht, eine Platte innerhalb eines Scroll und Kents Methode zu beschränken hat das nicht, dass es sehr gut ich aus irgendeinem Grunde nicht auf der Spur störte. Grundsätzlich sind die Kontrollen über die MaxWidth Einstellung erweitern konnte und schlug meine Absicht.

Nir sprühte funktionierte gut und hatte nicht das Problem mit dem Scroll, obwohl gibt es eine kleine Sache zu achten. Sie wollen sicher sein, die rechten und linken Ränder auf der TextBox auf 0 gesetzt werden oder sie werden in die Quere kommen. Ich habe auch die Bindung Viewportwidth statt Actual zu verwenden, um Probleme zu vermeiden, wenn die vertikale Bildlaufleiste erscheint.

Sie können diese verwenden, um die Breite des Datatemplate:

Width="{Binding ActualWidth,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}"

Stellen Sie sicher, dass Datatemplate Wurzel Margin = „0“ (Sie einige Panel als Wurzel verwenden können und stellen Sie die Margin für die Kinder von dieser Wurzel)

Vielleicht kann ich noch jemanden helfen, die diese Frage stoßen, denn dies ist ein sehr altes Thema ist.

Ich brauchte dies auch und schrieb dies ein Verhalten zu kümmern. Also hier ist das Verhalten:

public class StretchMaxWidthBehavior : Behavior<FrameworkElement>
{        
    protected override void OnAttached()
    {
        base.OnAttached();
        ((FrameworkElement)this.AssociatedObject.Parent).SizeChanged += this.OnSizeChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        ((FrameworkElement)this.AssociatedObject.Parent).SizeChanged -= this.OnSizeChanged;
    }

    private void OnSizeChanged(object sender, SizeChangedEventArgs e)
    {
        this.SetAlignments();
    }

    private void SetAlignments()
    {
        var slot = LayoutInformation.GetLayoutSlot(this.AssociatedObject);
        var newWidth = slot.Width;
        var newHeight = slot.Height;

        if (!double.IsInfinity(this.AssociatedObject.MaxWidth))
        {
            if (this.AssociatedObject.MaxWidth < newWidth)
            {
                this.AssociatedObject.HorizontalAlignment = HorizontalAlignment.Left;
                this.AssociatedObject.Width = this.AssociatedObject.MaxWidth;
            }
            else
            {
                this.AssociatedObject.HorizontalAlignment = HorizontalAlignment.Stretch;
                this.AssociatedObject.Width = double.NaN;
            }
        }

        if (!double.IsInfinity(this.AssociatedObject.MaxHeight))
        {
            if (this.AssociatedObject.MaxHeight < newHeight)
            {
                this.AssociatedObject.VerticalAlignment = VerticalAlignment.Top;
                this.AssociatedObject.Height = this.AssociatedObject.MaxHeight;
            }
            else
            {
                this.AssociatedObject.VerticalAlignment = VerticalAlignment.Stretch;
                this.AssociatedObject.Height = double.NaN;
            }
        }
    }
}

Dann können Sie es wie so verwenden:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="0" Text="Label" />
    <TextBox Grid.Column="1" MaxWidth="600">
          <i:Interaction.Behaviors>                       
               <cbh:StretchMaxWidthBehavior/>
          </i:Interaction.Behaviors>
    </TextBox>
</Grid>

Und schließlich zu vergessen die System.Windows.Interactivity Namespace zu verwenden, um das Verhalten zu verwenden.

Ich würde verwenden SharedSizeGroup

<Grid>
    <Grid.ColumnDefinition>
        <ColumnDefinition SharedSizeGroup="col1"></ColumnDefinition>  
        <ColumnDefinition SharedSizeGroup="col2"></ColumnDefinition>
    </Grid.ColumnDefinition>
    <TextBox Background="Azure" Text="Hello" Grid.Column="1" MaxWidth="200" />
</Grid>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top