<ColumnDefinition Width = "*" /> не соблюдается в DataTemplate - PullRequest
3 голосов
/ 05 февраля 2009

У меня есть WPF ListBox с определенной DataTemplate. В этом шаблоне у меня есть сетка, где ширина первого столбца должна занимать все оставшееся пространство в сетке.

Это похоже на работу вне ListBox, но не внутри. Почему так, и как я могу заставить его вести себя так же?

Вот мой код. См. Строку 36 и строку 70

 <UserControl x:Class="Russound.Windows.UI.UserControls.MAX.Reports.UniversalReportsWpf"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="250" Width="900"  >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>           
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>              

                <TextBlock Grid.Row="0" Height="35" Padding="0,3,5,0" Text="Standard Reports" HorizontalAlignment="Right" FontWeight="Bold" FontSize="20" Foreground="DarkBlue"/>
                <Border Grid.Row="1">
                    <Grid>
                        <Grid.Resources>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="HorizontalAlignment" Value="Left"/>
                                <Setter Property="VerticalAlignment" Value="Top"/>
                                <Setter Property="Height" Value="20"/>
                                <Setter Property="Padding" Value="0,3,5,0"/>
                                <Setter Property="Cursor" Value="Hand"/>
                                <Setter Property="Foreground" Value="WhiteSmoke" />
                            </Style>
                        </Grid.Resources>
                        <Grid.Background>
                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                <GradientStop Color="#FF808080" Offset="0"/>
                                <GradientStop Color="#FF000000" Offset="1"/>
                            </LinearGradientBrush>
                        </Grid.Background>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="300*" />
                            <ColumnDefinition Width="150" />
                            <ColumnDefinition Width="100" />
                            <ColumnDefinition Width="50" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Text="Report Name" FontWeight="Bold"/>
                        <TextBlock Grid.Column="1" Text="Last Run Date" FontWeight="Bold"/>
                        <TextBlock Grid.Column="2" Text="Last Ran By" FontWeight="Bold"/>
                        <TextBlock Grid.Column="3" Text="Secure" FontWeight="Bold"/>
                    </Grid>
                </Border>
            </Grid>
            <ListBox Grid.Row="1"  ItemsSource="{Binding}" 
                     ItemTemplate="{DynamicResource reportLayout}" 
                     VirtualizingStackPanel.VirtualizationMode="Recycling"
                     MouseDoubleClick="DisplaySelectedReport" Grid.RowSpan="2">
                <ListBox.SelectedItem>
                    <MouseBinding MouseAction="LeftDoubleClick"
                  Command="ApplicationCommands.Open" />
                </ListBox.SelectedItem>
                <ListBox.Resources>
                    <DataTemplate x:Key="reportLayout" DataType="AdHockReport">
                        <Grid>
                            <Grid.Resources>
                                <Style TargetType="{x:Type TextBlock}">
                                    <Setter Property="HorizontalAlignment" Value="Left"/>
                                    <Setter Property="VerticalAlignment" Value="Top"/>
                                    <Setter Property="Height" Value="25"/>
                                    <Setter Property="Padding" Value="0,3,5,0"/>
                                    <Setter Property="Cursor" Value="Hand"/>
                                </Style>                            
                            </Grid.Resources>    

                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="150" />
                                <ColumnDefinition Width="100" />
                                <ColumnDefinition Width="50" />
                            </Grid.ColumnDefinitions>

                            <TextBlock Grid.Column="0" ToolTip="Report Name" Text="{Binding Path=DisplayName}" FontWeight="Bold"/>
                            <TextBlock Grid.Column="1" ToolTip="Last Run Date" Text="{Binding Path=LastRunDate, StringFormat=MMM dd\, yyyy h:mm tt}" />
                            <TextBlock Grid.Column="2" ToolTip="Last Run By" Text="{Binding Path=LastRunBy}" />
                            <TextBlock Grid.Column="3" ToolTip="Secure" Text="{Binding Path=IsSecure}" />
                        </Grid>                    
                    </DataTemplate>
                </ListBox.Resources>
                <ListBox.Background>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FFE5E5E5" Offset="0"/>
                        <GradientStop Color="#FF888888" Offset="1"/>
                    </LinearGradientBrush>
                </ListBox.Background>           
            </ListBox>

        </Grid>
    </UserControl>

Ответы [ 2 ]

10 голосов
/ 05 февраля 2009

Это связано с тем, что ListBoxItem, содержащий сетку, определяет размер содержимого. Следовательно, «оставшееся пространство» для заполнения столбца размером со звезду составляет столько, сколько нужно столбцу.

Чтобы исправить это, используйте ListBox.ItemContainerStyle, чтобы установить для ListBoxItem.Hor HorizontalContentAlignment значение Stretch.

0 голосов
/ 05 февраля 2009

Попробуйте отредактировать ControlTemplate ListBox и удалите прокручиваемый внутри него, пусть это будет просто ItemsPresenter внутри Border.

...