到底
This commit is contained in:
parent
92a6b4f946
commit
de27a388e8
@ -2,8 +2,9 @@
|
|||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:local="clr-namespace:Wpf_AiSportsMicrospace"
|
xmlns:local="clr-namespace:Wpf_AiSportsMicrospace"
|
||||||
StartupUri="MainWindow.xaml">
|
StartupUri="Home.xaml">
|
||||||
<Application.Resources>
|
<Application.Resources>
|
||||||
|
|
||||||
</Application.Resources>
|
</Application.Resources>
|
||||||
|
|
||||||
</Application>
|
</Application>
|
||||||
|
|||||||
@ -1,14 +1,9 @@
|
|||||||
<Page x:Class="Wpf_AiSportsMicrospace.Home"
|
<Page x:Class="Wpf_AiSportsMicrospace.Home"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:local="clr-namespace:Wpf_AiSportsMicrospace.MyUserControl"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:local="clr-namespace:Wpf_AiSportsMicrospace"
|
|
||||||
mc:Ignorable="d"
|
|
||||||
d:DesignHeight="450" d:DesignWidth="800"
|
|
||||||
Title="Home">
|
Title="Home">
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
|
<local:CoverFlowControl x:Name="MyCo" HorizontalAlignment="Center" VerticalAlignment="Center" Width="1000"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Page>
|
</Page>
|
||||||
|
|||||||
@ -23,6 +23,7 @@ namespace Wpf_AiSportsMicrospace
|
|||||||
public Home()
|
public Home()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
MyCo.SelectedIndex = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
57
Wpf_AiSportsMicrospace/MyUserControl/CoverFlowControl.xaml
Normal file
57
Wpf_AiSportsMicrospace/MyUserControl/CoverFlowControl.xaml
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<UserControl x:Class="Wpf_AiSportsMicrospace.MyUserControl.CoverFlowControl"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:local="clr-namespace:Wpf_AiSportsMicrospace.MyUserControl"
|
||||||
|
xmlns:_3DTools="clr-namespace:_3DTools;assembly=3DTools"
|
||||||
|
Background="Black" x:Name="Root">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="50"/>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
<ColumnDefinition Width="50"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
|
<!-- 左按钮 -->
|
||||||
|
<Button Content="<" Grid.Column="0" Click="BtnPrev_Click" FontSize="24"/>
|
||||||
|
|
||||||
|
<!-- 图片滚动区域 -->
|
||||||
|
<ScrollViewer x:Name="Scroller" Grid.Column="1" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Disabled">
|
||||||
|
<ItemsControl x:Name="ItemsPanelImages" ItemsSource="{Binding Images, RelativeSource={RelativeSource AncestorType=UserControl}}">
|
||||||
|
<ItemsControl.ItemsPanel>
|
||||||
|
<ItemsPanelTemplate>
|
||||||
|
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"/>
|
||||||
|
</ItemsPanelTemplate>
|
||||||
|
</ItemsControl.ItemsPanel>
|
||||||
|
<ItemsControl.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Border Margin="10" Width="300" Height="500"
|
||||||
|
BorderThickness="0" BorderBrush="Transparent"
|
||||||
|
Cursor="Hand">
|
||||||
|
<Border.Style>
|
||||||
|
<Style TargetType="Border">
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding IsSelected}" Value="True">
|
||||||
|
<Setter Property="BorderBrush" Value="Yellow"/>
|
||||||
|
<Setter Property="BorderThickness" Value="4"/>
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Border.Style>
|
||||||
|
<Image Source="{Binding Path}" Stretch="UniformToFill"/>
|
||||||
|
<Border.InputBindings>
|
||||||
|
<MouseBinding MouseAction="LeftClick"
|
||||||
|
Command="{Binding DataContext.SelectImageCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
|
||||||
|
CommandParameter="{Binding Index}"/>
|
||||||
|
</Border.InputBindings>
|
||||||
|
</Border>
|
||||||
|
</DataTemplate>
|
||||||
|
</ItemsControl.ItemTemplate>
|
||||||
|
</ItemsControl>
|
||||||
|
</ScrollViewer>
|
||||||
|
|
||||||
|
<!-- 右按钮 -->
|
||||||
|
<Button Content=">" Grid.Column="2" Click="BtnNext_Click" FontSize="24"/>
|
||||||
|
</Grid>
|
||||||
|
</UserControl>
|
||||||
182
Wpf_AiSportsMicrospace/MyUserControl/CoverFlowControl.xaml.cs
Normal file
182
Wpf_AiSportsMicrospace/MyUserControl/CoverFlowControl.xaml.cs
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
using _3DTools;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Animation;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Media.Media3D;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
|
||||||
|
namespace Wpf_AiSportsMicrospace.MyUserControl
|
||||||
|
{
|
||||||
|
public partial class CoverFlowControl : UserControl
|
||||||
|
{
|
||||||
|
public ObservableCollection<ImageItem> Images { get; set; } = new ObservableCollection<ImageItem>();
|
||||||
|
|
||||||
|
private int selectedIndex;
|
||||||
|
public int SelectedIndex
|
||||||
|
{
|
||||||
|
get => selectedIndex;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value < 0) value = 0;
|
||||||
|
if (value >= Images.Count) value = Images.Count - 1;
|
||||||
|
selectedIndex = value;
|
||||||
|
UpdateSelectedItem();
|
||||||
|
ScrollToSelected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置默认显示图片
|
||||||
|
public int DefaultIndex { get; set; } = 1;
|
||||||
|
|
||||||
|
private const double NormalWidth = 300;
|
||||||
|
private const double NormalHeight = 500;
|
||||||
|
private const double SelectedWidth = 360;
|
||||||
|
private const double SelectedHeight = 600;
|
||||||
|
|
||||||
|
public CoverFlowControl()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
LoadImages();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadImages()
|
||||||
|
{
|
||||||
|
var paths = GetUserImages();
|
||||||
|
for (int i = 0; i < paths.Count; i++)
|
||||||
|
{
|
||||||
|
Images.Add(new ImageItem { Path = paths[i], Index = i });
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectedIndex = DefaultIndex; // 默认选中
|
||||||
|
}
|
||||||
|
private List<string> GetUserImages()
|
||||||
|
{// 相对路径,基于可执行文件所在目录
|
||||||
|
string relativePath = @"..\..\..\Resources\Img\Album";
|
||||||
|
string path = System.IO.Path.GetFullPath(relativePath); // 转为绝对路径
|
||||||
|
|
||||||
|
|
||||||
|
if (!Directory.Exists(path))
|
||||||
|
return new List<string>();
|
||||||
|
|
||||||
|
var files = new DirectoryInfo(path).GetFiles("*.jpg", SearchOption.TopDirectoryOnly);
|
||||||
|
return files.Select(f => f.FullName).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void UpdateSelectedItem()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Images.Count; i++)
|
||||||
|
{
|
||||||
|
if (i == SelectedIndex)
|
||||||
|
{
|
||||||
|
Images[i].IsSelected = true;
|
||||||
|
Images[i].BorderBrush = Brushes.Red;
|
||||||
|
Images[i].BorderThickness = 4;
|
||||||
|
Images[i].ImageWidth = SelectedWidth;
|
||||||
|
Images[i].ImageHeight = SelectedHeight;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Images[i].IsSelected = false;
|
||||||
|
Images[i].BorderBrush = Brushes.Transparent;
|
||||||
|
Images[i].BorderThickness = 0;
|
||||||
|
Images[i].ImageWidth = NormalWidth;
|
||||||
|
Images[i].ImageHeight = NormalHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ScrollToSelected()
|
||||||
|
{
|
||||||
|
var container = ItemsPanelImages.ItemContainerGenerator.ContainerFromIndex(SelectedIndex) as FrameworkElement;
|
||||||
|
if (container == null) return;
|
||||||
|
|
||||||
|
double offset = container.TransformToAncestor(Scroller).Transform(new Point(0, 0)).X;
|
||||||
|
double scrollTarget = offset + container.ActualWidth / 2 - Scroller.ActualWidth / 2;
|
||||||
|
|
||||||
|
DoubleAnimation anim = new DoubleAnimation(scrollTarget, TimeSpan.FromMilliseconds(300));
|
||||||
|
Scroller.BeginAnimation(ScrollViewerBehavior.HorizontalOffsetProperty, anim);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BtnPrev_Click(object sender, RoutedEventArgs e) => SelectedIndex--;
|
||||||
|
private void BtnNext_Click(object sender, RoutedEventArgs e) => SelectedIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ImageItem : INotifyPropertyChanged
|
||||||
|
{
|
||||||
|
public string Path { get; set; }
|
||||||
|
public int Index { get; set; }
|
||||||
|
|
||||||
|
private bool isSelected;
|
||||||
|
public bool IsSelected
|
||||||
|
{
|
||||||
|
get => isSelected;
|
||||||
|
set { isSelected = value; OnPropertyChanged(nameof(IsSelected)); }
|
||||||
|
}
|
||||||
|
|
||||||
|
private Brush borderBrush;
|
||||||
|
public Brush BorderBrush
|
||||||
|
{
|
||||||
|
get => borderBrush;
|
||||||
|
set { borderBrush = value; OnPropertyChanged(nameof(BorderBrush)); }
|
||||||
|
}
|
||||||
|
|
||||||
|
private double borderThickness;
|
||||||
|
public double BorderThickness
|
||||||
|
{
|
||||||
|
get => borderThickness;
|
||||||
|
set { borderThickness = value; OnPropertyChanged(nameof(BorderThickness)); }
|
||||||
|
}
|
||||||
|
|
||||||
|
private double imageWidth;
|
||||||
|
public double ImageWidth
|
||||||
|
{
|
||||||
|
get => imageWidth;
|
||||||
|
set { imageWidth = value; OnPropertyChanged(nameof(ImageWidth)); }
|
||||||
|
}
|
||||||
|
|
||||||
|
private double imageHeight;
|
||||||
|
public double ImageHeight
|
||||||
|
{
|
||||||
|
get => imageHeight;
|
||||||
|
set { imageHeight = value; OnPropertyChanged(nameof(ImageHeight)); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
|
private void OnPropertyChanged(string prop) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
|
||||||
|
}
|
||||||
|
public class ScrollViewerBehavior
|
||||||
|
{
|
||||||
|
public static readonly DependencyProperty HorizontalOffsetProperty =
|
||||||
|
DependencyProperty.RegisterAttached("HorizontalOffset", typeof(double), typeof(ScrollViewerBehavior),
|
||||||
|
new PropertyMetadata(0.0, OnHorizontalOffsetChanged));
|
||||||
|
|
||||||
|
private static void OnHorizontalOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (d is ScrollViewer scroll)
|
||||||
|
{
|
||||||
|
scroll.ScrollToHorizontalOffset((double)e.NewValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetHorizontalOffset(DependencyObject element, double value)
|
||||||
|
=> element.SetValue(HorizontalOffsetProperty, value);
|
||||||
|
|
||||||
|
public static double GetHorizontalOffset(DependencyObject element)
|
||||||
|
=> (double)element.GetValue(HorizontalOffsetProperty);
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Wpf_AiSportsMicrospace/Resources/Img/Album/1.jpg
Normal file
BIN
Wpf_AiSportsMicrospace/Resources/Img/Album/1.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 68 KiB |
BIN
Wpf_AiSportsMicrospace/Resources/Img/Album/2.jpg
Normal file
BIN
Wpf_AiSportsMicrospace/Resources/Img/Album/2.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 403 KiB |
BIN
Wpf_AiSportsMicrospace/Resources/Img/Album/3.jpg
Normal file
BIN
Wpf_AiSportsMicrospace/Resources/Img/Album/3.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 946 KiB |
BIN
Wpf_AiSportsMicrospace/Resources/Img/Album/4.jpg
Normal file
BIN
Wpf_AiSportsMicrospace/Resources/Img/Album/4.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
BIN
Wpf_AiSportsMicrospace/Resources/Img/Album/5.jpg
Normal file
BIN
Wpf_AiSportsMicrospace/Resources/Img/Album/5.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 109 KiB |
@ -9,6 +9,15 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Remove="Resources\Img\Album\1.jpg" />
|
||||||
|
<None Remove="Resources\Img\Album\2.jpg" />
|
||||||
|
<None Remove="Resources\Img\Album\3.jpg" />
|
||||||
|
<None Remove="Resources\Img\Album\4.jpg" />
|
||||||
|
<None Remove="Resources\Img\Album\5.jpg" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="3DTools" Version="1.0.0" />
|
||||||
<PackageReference Include="AutoMapper" Version="14.0.0" />
|
<PackageReference Include="AutoMapper" Version="14.0.0" />
|
||||||
<PackageReference Include="Emgu.CV" Version="4.12.0.5764" />
|
<PackageReference Include="Emgu.CV" Version="4.12.0.5764" />
|
||||||
<PackageReference Include="Emgu.CV.runtime.windows" Version="4.12.0.5764" />
|
<PackageReference Include="Emgu.CV.runtime.windows" Version="4.12.0.5764" />
|
||||||
@ -54,7 +63,21 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="UserControl\" />
|
<Resource Include="Resources\Img\Album\1.jpg">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Resource>
|
||||||
|
<Resource Include="Resources\Img\Album\2.jpg">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Resource>
|
||||||
|
<Resource Include="Resources\Img\Album\3.jpg">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Resource>
|
||||||
|
<Resource Include="Resources\Img\Album\4.jpg">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Resource>
|
||||||
|
<Resource Include="Resources\Img\Album\5.jpg">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Resource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user