2010-09-26 21 views
17

Angenommen, ich habe 2 Knöpfe in einem Element und möchte die 2 Elemente so einstellen, dass sie immer die halbe Breite ihres enthaltenen Elements ausfüllen. Kann ich das tun?WPF: Kann ich die Breite eines Elements nach Prozenten einstellen?

UPDATE

warum kann ich wie

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

warum die Arbeit 1 * tut in diesem Zusammenhang? Ich erhalte die Fehler

nicht konvertieren kann „1 *“

+1

Es funktioniert nicht, weil Sie ein StackPanel verwenden. Star-Sizing funktioniert nur mit Grid. – ASanch

+3

oh und insbesondere kann die Größenanpassung nur für die ColumnDefinition.Width-Eigenschaft oder die RowDefinition.Height-Eigenschaft erfolgen. Es kann nicht auf den untergeordneten Steuerelementen festgelegt werden (wie oben mit der Width-Eigenschaft der Schaltfläche). – ASanch

Antwort

43

Sie eine Grid mit zwei Spalten für diese verwenden können.

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

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

Beachten Sie die Verwendung von Stern (*) in der ColumnDefinition.Width Eigenschaft. Dies bedeutet, dass beide Spalten den gleichen Platz einnehmen. Im obigen Beispiel belegt jede Schaltfläche jeweils die Hälfte des verfügbaren Speicherplatzes von Grid. Wenn Sie also Width als gleich 2* festlegen, nimmt diese Spalte doppelt so viel Speicherplatz wie die andere Spalte ein. Hoffe, das macht Sinn.

+0

ich habe alles vergessen über das * dingy! danke –

+0

oh, siehe mein update –

1

Ich habe ein ContentControl erstellt, mit dem ich Inhalt umwandeln kann, um eine dynamische prozentuale Breite/Höhe hinzuzufügen.

/// <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(); 
    } 
} 
Verwandte Themen