WPF:调整网格和列表框内的图像大小

时间:2009-02-25 20:27:17

标签: wpf image listbox grid

我有一个带水平滚动的ListBox,每个项目都包含一个两行网格。第一行包含图像,第二行包含用于渲染第一行的边框 (是的,是的。我知道。还有另一次封面尝试......)

我需要一些帮助来确定图像的大小。如果我没有指定任何大小,它将以完整大小渲染图像,但我希望它受到网格行高度的限制。如果窗口调整大小,图像应调整大小。

任何线索?

更新
我现在已经改变了一点代码。首先,我删除了一个不必要的触发器,但重要的部分是

  • 列表框中已禁用垂直滚动条。
  • 在coverImage上移除了高度
  • 从layoutTransformation更改为RenderTransformation
  • 缩小未选择的项目,而不是缩放所选项目。

这给了我几乎我想要的东西。我无法找到coverImage和coverReflection之间的差距。任何线索,og可能我应该发一个新问题......?

第二次更新:
我想我现在有一个反思差距的解决方案。但是感觉有点尴尬。我想有更好的方法可以做到。

我做的是   - 我不再翻转边框了,我正在翻转视觉画笔。   - 我为视觉画笔添加了TileMode =“Tile”

现在,我不确定为什么会这样,但它接近我想要的,所以......

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    x:Class="UntitledProject1.Window1"
    x:Name="Window"
    Title="Window1"
    Width="801" Height="786">
    <Window.Resources>
        <XmlDataProvider x:Key="dataProvider" XPath="Bilder">
            <x:XData>
                <Bilder xmlns="">
                    <Bilde>75760-1_-8589666289339775808.jpg</Bilde>
                    <Bilde>73255-3_-8589662994232744558.jpg</Bilde>
                    <Bilde>75760-1_-8589666289339775808.jpg</Bilde>
                    <Bilde>73255-3_-8589662994232744558.jpg</Bilde>
                    <Bilde>75760-1_-8589666289339775808.jpg</Bilde>
                    <Bilde>73255-3_-8589662994232744558.jpg</Bilde>
                </Bilder>
            </x:XData>
        </XmlDataProvider>

        <ControlTemplate x:Key="listControlTemplate" TargetType="{x:Type ListBoxItem}">
            <Grid x:Name="listItemGrid">
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>      
                <Image x:Name="coverImage" 
                       Source="{Binding Path=InnerText}"  
                       Stretch="Uniform" 
                       HorizontalAlignment="Stretch" 
                       VerticalAlignment="Bottom"  
                       Grid.Row="0" 
                       RenderTransformOrigin="0.5,1">
                    <Image.RenderTransform>
                        <TransformGroup>
                            <ScaleTransform ScaleX="0.7" ScaleY="0.7"/>
                            <SkewTransform AngleX="0" AngleY="0"/>
                            <RotateTransform Angle="0"/>
                            <TranslateTransform X="0" Y="0"/>
                        </TransformGroup>
                    </Image.RenderTransform>
                </Image>
                <Border x:Name="coverReflection" 
                        RenderTransformOrigin="0.5,0" 
                        Height="{Binding Path=ActualHeight, ElementName=coverImage, Mode= Default}" 
                        VerticalAlignment="Top" 
                        Grid.Row="1"
                        >
                    <Border.OpacityMask>
                        <LinearGradientBrush EndPoint="0.0,1" StartPoint="0.0,0">
                            <GradientStop Color="#00000000" Offset="0.6"/>
                            <GradientStop Color="#BBFFFFFF" Offset="0"/>
                        </LinearGradientBrush>
                    </Border.OpacityMask>
                    <Border.RenderTransform>
                        <TransformGroup>
                            <ScaleTransform ScaleX="0.7" ScaleY="0.7"/>
                            <SkewTransform AngleX="0" AngleY="0"/>
                            <RotateTransform Angle="0"/>
                            <TranslateTransform X="0" Y="0"/>
                        </TransformGroup>
                    </Border.RenderTransform>
                    <Border.Background>
                        <VisualBrush Visual="{Binding ElementName=coverImage}" TileMode="Tile">
                            <VisualBrush.Transform>
                                <TransformGroup>
                                    <ScaleTransform ScaleX="1" ScaleY="-1"/>
                                    <SkewTransform AngleX="0" AngleY="0"/>
                                    <RotateTransform Angle="0"/>
                                    <TranslateTransform X="0" Y="0"/>
                                </TransformGroup>                               
                            </VisualBrush.Transform>
                        </VisualBrush>
                    </Border.Background>
                </Border>               
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="IsSelected" Value="True">                    
                    <Setter Property="RenderTransform" TargetName="coverImage">
                        <Setter.Value>
                            <TransformGroup>
                                <ScaleTransform ScaleX="1" ScaleY="1"/>
                                <SkewTransform AngleX="0" AngleY="0"/>
                                <RotateTransform Angle="0"/>
                                <TranslateTransform X="0" Y="0"/>
                            </TransformGroup>
                        </Setter.Value>
                    </Setter>                   
                    <Setter Property="RenderTransform" TargetName="coverReflection">
                        <Setter.Value>
                            <TransformGroup>
                                <ScaleTransform ScaleX="1" ScaleY="1"/>
                                <SkewTransform AngleX="0" AngleY="0"/>
                                <RotateTransform Angle="0"/>
                                <TranslateTransform X="0" Y="0"/>
                            </TransformGroup>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>

        <Style TargetType="{x:Type ListBoxItem}" x:Key="listStyle">
            <Setter Property="Template" Value="{StaticResource listControlTemplate}" />
        </Style>
    </Window.Resources>
    <Window.BindingGroup>
        <BindingGroup/>
    </Window.BindingGroup>

    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource dataProvider}, XPath=/Bilder/Bilde}">
        <ListBox ScrollViewer.HorizontalScrollBarVisibility="Hidden"
                 ScrollViewer.VerticalScrollBarVisibility="Disabled"
                 ItemsSource="{Binding }" 
                 IsSynchronizedWithCurrentItem="True" 
                 Background="#FF000000"
                 ItemContainerStyle="{StaticResource listStyle}" 
                 VerticalAlignment="Stretch"
                 >
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel IsItemsHost="True" Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>
    </Grid>
</Window>

1 个答案:

答案 0 :(得分:1)

修改ListBoxItem的样式,以包含绑定到Height属性的ListBox.ActualHeight属性的setter:

    <Style TargetType="{x:Type ListBoxItem}" x:Key="listStyle">
        <Setter Property="Template" Value="{StaticResource listControlTemplate}" />
        <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}, Path=ActualHeight}" />
    </Style>

这会使您的物品与其容器一样高。从那以后,您可以将控件模板中的Grid绑定到其模板化父级的ActualHeight并调整图像大小。你必须要玩一点才能达到高度差。例如,您可以使用图像在行上方创建行,对于选定的图像,可以使用setter更改其Row和RowSpan属性。