2 つのイメージ コントロールがあります。
キーボードの左右ボタンを押すと、コントロールが左右にスライドするプログラムです。
初めて実行すると、イメージ コントロール番号 1 のみが表示されます。
鍵盤を押すと1番と2番がスライドします。
そして2番の画像ソースを変更。
目的は、特定のフォルダ内のすべての画像を取得することであり、キーボードを使用したスライドショーです。
しかし、いくつかの問題があります。
矢印キーを押したままにすると、アニメーションが予定よりもはるかに速くループします。
率直に言って、もっと速くなると思いますが、これは簡単ではありません。
キーボードを押したまま離すと、最後のアニメーションが再生されます。
キーボードが最終的に離されたときに、Completed イベントが 1 回だけ発生するようにします。
(画像を明確に再配置するため)
<Window x:Class="WPFTest2022.MainWindow"
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"
xmlns:local="clr-namespace:WPFTest2022"
mc:Ignorable="d"
PreviewKeyDown="Window_PreviewKeyDown"
PreviewKeyUp="Window_PreviewKeyUp"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Image x:Name="NewPage" Width="Auto" Height="Auto" Stretch="Uniform">
<Image.RenderTransform>
<TransformGroup>
<TranslateTransform x:Name="NewPageTranslateTransform" X="0" Y="0"/>
</TransformGroup>
</Image.RenderTransform>
</Image>
<Image x:Name="CurrentPage">
<Image.RenderTransform>
<TransformGroup>
<TranslateTransform x:Name="CurrentPageTranslateTransform" X="0" Y="0"/>
</TransformGroup>
</Image.RenderTransform>
</Image>
</Grid>
enum PageDirection
{
Prev,
Next
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
string imageDirectoryPath = @"D:\";
List<string> imageList;
int currentPageNumber = 0;
DoubleAnimation NewPageAnimation = new DoubleAnimation();
DoubleAnimation CurrentPageAnimation = new DoubleAnimation();
Duration animationDuration = TimeSpan.FromSeconds(.2);
bool IsKeyPressed = false;
public MainWindow()
{
InitializeComponent();
imageList = System.IO.Directory.GetFiles(imageDirectoryPath).ToList<string>();
NewPageAnimation.To = 0;
NewPageAnimation.Duration = animationDuration;
CurrentPageAnimation.From = 0;
CurrentPageAnimation.Duration = animationDuration;
CurrentPage.Source = new BitmapImage(new Uri(imageList[currentPageNumber]));
NewPageAnimation.Completed += (s, e) =>
{
isRunningAnimation = false;
};
}
bool isRunningAnimation = false;
private void ImageSlider(PageDirection direction)
{
if (isRunningAnimation)
{
CurrentPage.Source = NewPage.Source;
}
isRunningAnimation = true;
if (direction.Equals(PageDirection.Next) && currentPageNumber >= imageList.Count - 1)
{
return;
}
NewPageAnimation.From = direction.Equals(PageDirection.Next) ? this.ActualWidth : -this.ActualWidth;
CurrentPageAnimation.To = direction.Equals(PageDirection.Next) ? -this.ActualWidth : this.ActualWidth;
NewPage.Source = new BitmapImage(new Uri(imageList[direction.Equals(PageDirection.Next) ? ++currentPageNumber : --currentPageNumber])); //new BitmapImage(new Uri(textBookList[pageKind.Equals(PageKind.Next) ? ++currentPageNumber : --currentPageNumber]));
CurrentPageTranslateTransform.BeginAnimation(TranslateTransform.XProperty, CurrentPageAnimation, HandoffBehavior.Compose);
NewPageTranslateTransform.BeginAnimation(TranslateTransform.XProperty, NewPageAnimation, HandoffBehavior.Compose);
}
private void CurrentPageAnimation_Completed(object sender, EventArgs e)
{
// Last Animation Completed
}
private void NewPageAnimation_Completed(object sender, EventArgs e)
{
// Last Animation Completed
}
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
Key inputKey = e.Key.Equals(Key.ImeProcessed) ? e.ImeProcessedKey : e.Key;
//NewPageAnimation.Completed -= new EventHandler(NewPageAnimation_Completed);
IsKeyPressed = true;
switch (inputKey)
{
case Key.D:
case Key.Right:
if (currentPageNumber < imageList.Count)
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
{
ImageSlider(PageDirection.Next);
}));
}
break;
case Key.A:
case Key.Left:
if(currentPageNumber > 0)
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
{
ImageSlider(PageDirection.Prev);
}));
}
break;
}
}
private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
{
Key inputKey = e.Key.Equals(Key.ImeProcessed) ? e.ImeProcessedKey : e.Key;
//NewPageAnimation.Completed += new EventHandler(NewPageAnimation_Completed);
IsKeyPressed = false;
switch (inputKey)
{
case Key.D:
case Key.Right:
break;
case Key.A:
case Key.Left:
break;
}
}
}