2010-09-26 12 views
17

Bir Öğe'de 2 düğmem var ve her öğeyi içeren öğenin 1/2 genişliğini her zaman doldurmak için 2 öğeyi ayarlamak istiyorum, bunu yapabilir miyim?WPF: Bir elemanın genişliğini yüzde cinsinden ayarlayabilir miyim?

GÜNCELLEME

i

<StackPanel Orientation="Horizontal" Grid.Row="0"> 
    <Button Content="Click me" Command="{Binding ClickCommand}" Width="1*" /> 
    <Button Content="Exit" Command="{Binding CloseCommand}" Width="1*" /> 
</StackPanel> 

gibi bir şey neden bu bağlamda 1 * doesnt iş yapmak neden bunu? i

"1 *"

+1

Bir StackPanel kullandığınız için işe yaramıyor. Yıldız boyutlandırma sadece Izgara ile çalışır. – ASanch

+3

oh ve özellikle, star-sizeing sadece ColumnDefinition.Width özelliği veya RowDefinition.Height özelliği üzerinde yapılabilir. Çocuk kontrollerinde (Button'un Genişlik özelliğiyle yaptığınız gibi) ayarlanamaz. – ASanch

cevap

43

Bunun için iki sütunlu bir Grid kullanabilirsiniz dönüştürülemez hatayı olsun.

<Grid> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="1*"/> 
    <ColumnDefinition Width="1*"/> 
    </Grid.ColumnDefinitions> 

    <Button Grid.Column="0">Button1</Button> 
    <Button Grid.Column="1">Button2</Button> 
</Grid> 

Bildirimi ColumnDefinition.Width özelliğinde yıldızın kullanılması (*). Bu, her iki sütunun da aynı miktarda yer alacağı anlamına gelir. Yukarıdaki örnekte, her bir düğmenin her biri, Grid içeren mevcut boşluğun 1/2'sini işgal edecektir. Dolayısıyla, bir Width'un 2*'a eşit olmasını sağlarsanız, bu sütun diğer sütunla iki kat daha fazla yer kaplar. Umarım bu mantıklıdır.

+0

Her şeyi unuttum * şeytan! teşekkürler –

+0

oh, güncellememi görün –

1

İçeriği dinamik yüzde genişlik/yükseklik eklemek için sarmamı sağlayan bir ContentControl oluşturdum.

/// <summary> 
/// This control has a dynamic/percentage width/height 
/// </summary> 
public class FluentPanel : ContentControl, IValueConverter 
{ 
    #region Dependencie Properties 

    public static readonly DependencyProperty WidthPercentageProperty = 
     DependencyProperty.Register("WidthPercentage", typeof(int), typeof(FluentPanel), new PropertyMetadata(-1, WidthPercentagePropertyChangedCallback)); 

    private static void WidthPercentagePropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     ((FluentPanel)dependencyObject).OnWidthPercentageChange(); 
    } 

    public int WidthPercentage 
    { 
     get { return (int)GetValue(WidthPercentageProperty); } 
     set { SetValue(WidthPercentageProperty, value); } 
    } 

    public static readonly DependencyProperty HeightPercentageProperty = 
     DependencyProperty.Register("HeightPercentage", typeof(int), typeof(FluentPanel), new PropertyMetadata(-1, HeightPercentagePropertyChangedCallback)); 

    private static void HeightPercentagePropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     ((FluentPanel)dependencyObject).OnHeightPercentageChanged(); 
    } 

    public int HeightPercentage 
    { 
     get { return (int)GetValue(HeightPercentageProperty); } 
     set { SetValue(HeightPercentageProperty, value); } 
    } 

    #endregion 

    #region Methods 

    private void OnWidthPercentageChange() 
    { 
     if (WidthPercentage == -1) 
     { 
      ClearValue(WidthProperty); 
     } 
     else 
     { 
      SetBinding(WidthProperty, new Binding("ActualWidth") { Source = Parent, Converter = this, ConverterParameter = true }); 
     } 
    } 

    private void OnHeightPercentageChanged() 
    { 
     if (HeightPercentage == -1) 
     { 
      ClearValue(HeightProperty); 
     } 
     else 
     { 
      SetBinding(HeightProperty, new Binding("ActualHeight") { Source = Parent, Converter = this, ConverterParameter = false }); 
     } 
    } 

    #endregion 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if ((bool)parameter) 
     { 
      // width 
      return (double)value * (WidthPercentage * .01); 
     } 
     else 
     { 
      // height 
      return (double)value * (HeightPercentage * .01); 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 
İlgili konular