Как ограничить высоту столбца чужой? - PullRequest
4 голосов
/ 29 декабря 2010

У меня есть сетка в WPF, которая состоит из 4 строк вдоль 2 столбцов, где столбец 1 содержит элемент управления изображением, а столбец 2 содержит 4 текстовых блока.Проблема в том, что элемент управления Image масштабируется по размеру Image и слишком расширяет элемент списка [Свойство в DataTemplate] и заставляет все выглядеть искаженным.Я не хочу вручную устанавливать максимальную высоту / ширину, потому что я хочу, чтобы размер изображения соответствовал размеру 4 текстовых блоков, которые находятся рядом с ним.Есть идеи?

<DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                    <Image Source="{Binding Logo, Converter={StaticResource BSConverter}}" Grid.Row="0" Grid.RowSpan="4" 
                           Grid.Column="0" Stretch="Uniform" SnapsToDevicePixels="True"/>
                    <TextBlock Text="{Binding Name}" Grid.Row="0" Grid.Column="1"/>
                    <TextBlock Text="{Binding Author}" Grid.Row="1" Grid.Column="1"/>
                    <TextBlock Text="{Binding Version}" Grid.Row="2" Grid.Column="1"/>
                    <TextBlock Text="{Binding Description}" Grid.Row="3" Grid.Column="1"/>
                </Grid>
            </DataTemplate>

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 29 декабря 2010

Незначительная модификация ваших контейнеров для использования StackPanel в сочетании с Grid и ссылка на привязку StackPanel через ElementName должна предоставить вам визуальные элементы, которые вы ищете ...

<DataTemplate>
    <Grid HorizontalAlignment="Left" VerticalAlignment="Top">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Image VerticalAlignment="Top" HorizontalAlignment="Right" Margin="0,0,8,0" Source="{Binding Logo, Converter={StaticResource BSConverter}}" 
                           Grid.Column="0" Stretch="Uniform" SnapsToDevicePixels="True" 
           Height="{Binding ElementName=Contents, Path=ActualHeight}"/>

        <StackPanel VerticalAlignment="Top" Name="Contents" Grid.Column="1" Orientation="Vertical">
            <TextBlock Text="{Binding Name}"/>
            <TextBlock Text="{Binding Author}"/>
            <TextBlock Text="{Binding Version}"/>
            <TextBlock Text="{Binding Description}"/>
        </StackPanel>
    </Grid>
</DataTemplate>
2 голосов
/ 29 декабря 2010

Вы можете использовать Grid.IsSharedSizeGroup в Parent ListBox, чтобы убедиться, что все ваши элементы имеют одинаковую ширину для первого столбца, как это

<ListBox ...
         Grid.IsSharedSizeScope="True">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="GroupA"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                ...

Для проблемы высоты изображения вы можете привязать высоту к ActualHeight родительской сетки с FallbackValue 1,0 (чтобы высота изображения не влияла на высоту сетки)

<Image Source="{Binding Logo, Converter={StaticResource BSConverter}}"
       Grid.Row="0"
       Grid.RowSpan="4"
       Grid.Column="0"
       Stretch="Uniform" SnapsToDevicePixels="True"
       Height="{Binding RelativeSource={RelativeSource AncestorType=Grid},
                        Path=ActualHeight,
                        FallbackValue=1.0}"/>
...