2012-07-20 4 views
5

Ich habe folgende Expander für eine DataGrid definiert.Grid Expander Header - kann nicht Anordnung richtig bekommen

<Expander IsExpanded="True" HorizontalAlignment="Stretch" Background="Blue"> 
    <Expander.Header> 
      <Grid HorizontalAlignment="Stretch" Background="BurlyWood"> 
         <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="3*" /> 
         <ColumnDefinition Width="*" /> 
         </Grid.ColumnDefinitions> 

         <TextBlock Text="{Binding Path=Name, StringFormat=\{0:D\}}" FontWeight="Bold" /> 
         <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Column="1"> 
         <TextBlock Text="Total : "/> 
         <TextBlock Text="{Binding Path=Items, Converter={StaticResource sumConverter}}" FontWeight="Bold"/> 
         </StackPanel> 
       </Grid> 
     </Expander.Header> 
     <ItemsPresenter /> 
</Expander> 

Ich muss den Artikelnamen in der linken und die Summe am rechten Ende der Gruppenkopfzeile anzeigen. Doch was bekomme ich, ist dies:

enter image description here

Wie kann ich die ‚Total‘ am rechten Ende des Kopfes bewegen?

+0

seltsam, aber es funktioniert für mich. Kann ein anderer Code deine Logik zerstören? – Artiom

Antwort

5

hatte ich das gleiche Problem und wenn ich es richtig das Problem ist, dass die ContentPresenter für Expander.Header erinnere mich nicht die HorizontalAlignment von Expander schert. Ich fand irgendwo diese nette Abhilfe:

<Expander.Header> 
    <Grid HorizontalAlignment="{Binding Path=HorizontalAlignment, RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}, Mode=OneWayToSource}"> 
     ... 
    </Grid> 
</Expander.Header> 
+0

Es funktioniert! Es klappt! Vielen Dank. – nakiya

0

Versuchen Sie, diese

<Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="Auto" /> 
         <ColumnDefinition Width="5" /> //space between two textblocks 
        <ColumnDefinition Width="Auto" /> 
        </Grid.ColumnDefinitions> 

        <TextBlock Text="{Binding Path=Name, StringFormat=\{0:D\}}" FontWeight="Bold" /> 
        <TextBlock Text="Total : " Grid.Column="2"/> 
        <TextBlock Text="{Binding Path=Items, Converter={StaticResource sumConverter}}" FontWeight="Bold" Grid.Column="4"/> 

      </Grid> 

Ich hoffe, die

+0

Immer noch das Gleiche. – nakiya

0

Sie helfen können, das gewünschte Ergebnis erzielen einen Valueconverter unter Verwendung der Breite des Rasters in dem Expander.Header auf einen Wert in Bezug auf die setzen Expander.ActualWidth, wie diese:

<Expander Name="MyExpander" IsExpanded="True" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Background="Blue"> 
     <Expander.Header> 
      <Grid HorizontalAlignment="Stretch" Background="BurlyWood" Width="{Binding ElementName=MyExpander, Path=ActualWidth, Converter={MyConverters:ExpanderHeaderWidthConverter}, ConverterParameter=30}"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Text="{Binding Path=Name, StringFormat=\{0:D\}}" FontWeight="Bold" /> 
       <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Column="2"> 
        <TextBlock Text="Total : "/> 
        <TextBlock Text="{Binding Path=Items, Converter={StaticResource sumConverter}}" FontWeight="Bold"/> 
       </StackPanel> 
      </Grid> 
     </Expander.Header> 
     <ItemsPresenter /> 
    </Expander> 

-Code für den Valueconverter:

public abstract class BaseConverter : MarkupExtension 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 
} 

public class ExpanderHeaderWidthConverter : BaseConverter, IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // The actuacl Width of the Expander 
     double width = (double)value; 

     // Default width difference 
     double diff = 25.0; 

     if (parameter != null) 
     { 
      // If the parameter is not null, try to use it as width difference 
      Double.TryParse(parameter.ToString(), out diff); 
     } 

     // If width - diff is less than 0, return double.NaN instead. 
     if (width - diff < 0) 
     { 
      return double.NaN; 
     } 

     // Return the modified width 
     return width - diff; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     double width = (double)value; 
     double diff = 25.0; 
     if (parameter != null) 
     { 
      Double.TryParse(parameter.ToString(), out diff); 
     } 
     return width + diff; 
    } 
} 

Versuchen Sie, den ConverterParameter zu ändern, bis Sie das gewünschte Ergebnis erhalten.

Verwandte Themen