在 WPF 中操作图像控件

本文关键字:图像 控件 操作 WPF | 更新日期: 2023-09-27 18:32:07

我正在使用 Flickr.NET API在空闲时间学习WPF。

我要执行的第一个功能是按名称/描述/标签搜索图像。这导致我在 WPF 中使用图像。

这是我的设置:

- XAML

<Grid>
    <ItemsControl x:Name="PhotoList" HorizontalAlignment="Left" Height="639" Margin="10,10,0,0" VerticalAlignment="Top" Width="1060" Style="{DynamicResource ScrollableItemControlStyle}" >
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal" Height="639" Width="1060"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type sys:String}">
                <Image Width="200" Source="{Binding Url}" Margin="0,0,5,5" MouseDown="OpenSelectedImage" MouseEnter="Image_MouseEnter" MouseLeave="Image_MouseLeave">
                </Image>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    <Button x:Name="BackButton" Style="{DynamicResource ModernButtonStyle}" Content="Back" HorizontalAlignment="Left" Margin="710,654,0,0" VerticalAlignment="Top" Width="360" Height="56  " TabIndex="2" Background="#FF6600CC" IsDefault="True" Foreground="White" Click="BackButton_Click"/>
</Grid>  

- C#

public ObservableCollection<PhotoResult> images;
public ImageSearchResult(List<PhotoResult> imageList)
{
    InitializeComponent();
    if (imageList.Count > 0)
    {
        images = new ObservableCollection<PhotoResult>();
        foreach (var image in imageList)
        {
            images.Add(image);
        }
        PhotoList.ItemsSource = images;
    }
}

我们能否实现:

  1. 我的包装面板根本无法滚动。
  2. 当鼠标悬停在 Image 控件上时,我可以更改其大小(带有动画)以指示选择。但它覆盖其他控件,而不是重新排列位置。我们能解决这个问题吗?我认为在这种情况下,ZIndex无法按预期工作。
  3. 另外,我们可以在选择时更改图像边框吗?我目前做不到。

在 WPF 中操作图像控件

如果你想要一些"选择行为",你应该使用一些实现 ItemsControl 的 WPF 控件 - 你的"ItemsControl"不提供任何选择。

如果使用"列表框"(MSDN ListBox),则可以将 ItemsPanel 设置为所需的任何内容。 例如,您可以使用"UniformGrid",其中每个项目共享相同的大小。您可以设置所需的行/列。

    <ItemsPanelTemplate x:Key="ItemsPanelTemplate">
        <UniformGrid Rows="2"/>
    </ItemsPanelTemplate>

若要实现调整"鼠标悬停"大小或在选择情况下设置边框,可以为列表框定义"ItemContainerStyle"。

        <Style x:Key="ListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="Padding" Value="2,0,0,0"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                    <Border x:Name="border" BorderBrush="Black" BorderThickness="0">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="image">
                                            <EasingDoubleKeyFrame KeyTime="0" Value="1.25"/>
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="image">
                                            <EasingDoubleKeyFrame KeyTime="0" Value="1.25"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Disabled"/>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="SelectionStates">
                                <VisualState x:Name="Unselected"/>
                                <VisualState x:Name="Selected">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFB61F1F"/>
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="SelectedUnfocused"/>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Image x:Name="image" Height="100" Width="100">
                            <Image.LayoutTransform>
                                <TransformGroup>
                                    <ScaleTransform/>
                                    <SkewTransform/>
                                    <RotateTransform/>
                                    <TranslateTransform/>
                                </TransformGroup>
                            </Image.LayoutTransform>
                        </Image>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="Selector.IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

总之,您现在可以通过以下方式组合 ItemsPanel 和 ItemContainerStyle 的列表框:

<ListBox ItemsPanel="{DynamicResource ItemsPanelTemplate}" 
         ItemsSource="{Binding Collection}"
         ItemContainerStyle="{DynamicResource ListBoxItemStyle}" />

这可能不是您所有问题的完整解决方案,但它应该提供一个良好的起点。