HorizontalAlignment = الإمتداد، MaxWidth، واليسار محاذاة في نفس الوقت؟

StackOverflow https://stackoverflow.com/questions/280331

  •  07-07-2019
  •  | 
  •  

سؤال

وهذا يبدو وكأنه ينبغي أن يكون سهلا ولكن أنا الحيرة. في WPF، أود مربع نص والتي تمتد لعرض انها الأم، ولكن فقط إلى الحد الأقصى لعرض. والمشكلة هي أن أريد لها أن تترك له ما يبرره في الأصل. للحصول عليه لتمتد لديك لاستخدام HorizontalAlignment = "تمدد"، ولكن بعد ذلك يتم توسيط النتيجة. لقد جربت HorizontalContentAlignment، ولكن لا يبدو أن تفعل أي شيء.

وكيف يمكنني الحصول على هذه مربع النص الأزرق في النمو مع حجم النافذة، ويكون أقصى عرض 200 بكسل، ويترك لها ما يبررها؟

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

ما هي خدعة؟

هل كانت مفيدة؟

المحلول

ويمكنك تعيين HorizontalAlignment إلى اليسار، تعيين MaxWidth الخاصة بك ومن ثم ربط Width إلى ActualWidth من العنصر الأصلي:

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

نصائح أخرى

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

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

وكل الإجابات التي عملت لمشكلة قلت - شكرا لك

في طلبي الحقيقي رغم ذلك، كنت أحاول أن تقيد لجنة من داخل ScrollViewer ولم طريقة كينت لا يعالج بشكل جيد جدا لسبب ما لم يكلف نفسه عناء تعقب. في الأساس الضوابط يمكن أن يتوسع خارج إطار MaxWidth وهزم هدفي.

وتقنية نير عملت بشكل جيد وليس لديها مشكلة مع ScrollViewer، وإن كان هناك شيء ثانوي واحد لمشاهدة ل. كنت تريد أن تتأكد من يتم تعيين هوامش اليمين واليسار في مربع نص إلى 0 أو أنها سوف تحصل في الطريق. أود أيضا أن تغير ملزمة لاستخدام ViewportWidth بدلا من ActualWidth لتجنب المشاكل عندما ظهر شريط التمرير العمودي.

ويمكنك استخدام هذا للعرض من DataTemplate الخاص بك:

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

تأكد من الجذر DataTemplate لديه الهامش = "0" (يمكنك استخدام بعض وحة كجذر وتعيين الهامش لأبناء هذا الجذر)

وربما لا يزال يمكنني مساعدة شخص ما من الذي المطبات في هذه المسألة، لأن هذه قضية قديمة جدا.

وأنا بحاجة إلى هذا أيضا، وكتب السلوك لرعاية هذا. حتى هنا هو السلوك:

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

وبعد ذلك يمكنك استخدامه مثل ذلك:

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

وأخيرا أن ننسى أن استخدام مساحة System.Windows.Interactivity لاستخدام السلوك.

وأود أن استخدام 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top