0

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;
        }
    }
}
4

0 に答える 0