4

Windowsストアアプリの場合

XAML

<Page
    x:Class="FunctionTest.BlankPage1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:FunctionTest"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Page.Resources>
        <Storyboard x:Name="FloatingFlipOver">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.GlobalOffsetZ)" Storyboard.TargetName="FloatingRoot">
                <EasingDoubleKeyFrame KeyTime="0" Value="-2000"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0">
                    <EasingDoubleKeyFrame.EasingFunction>
                        <QuarticEase/>
                    </EasingDoubleKeyFrame.EasingFunction>
                </EasingDoubleKeyFrame>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)" Storyboard.TargetName="FloatingRoot">
                <EasingDoubleKeyFrame KeyTime="0" Value="180"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0">
                    <EasingDoubleKeyFrame.EasingFunction>
                        <QuarticEase/>
                    </EasingDoubleKeyFrame.EasingFunction>
                </EasingDoubleKeyFrame>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="FloatingRoot">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </Page.Resources>

    <Grid>        
        <Grid x:Name="FloatingRoot" Visibility="Collapsed" Width="500" Height="300">
            <Grid.Projection>
                <PlaneProjection  CenterOfRotationX="0.5" CenterOfRotationY="0.5"/>
            </Grid.Projection>
            <Rectangle x:Name="FloatingBackground" Fill="SkyBlue" />
            <FlipView>
                <Grid x:Name="FloatingContainer" Width="300" Height="300">

                </Grid>
            </FlipView>
        </Grid>
        <Button Content="Test" HorizontalAlignment="Left" Margin="46,36,0,0" VerticalAlignment="Top" Click="Test_Click"/>
    </Grid>
</Page>

コード

private void Test_Click(object sender, RoutedEventArgs e)
{
    Button msiBtn = new Button();
    msiBtn.Content = "addBtn";
    msiBtn.Width = 100; msiBtn.Height = 50;
    msiBtn.Tapped += msiBtn_Tapped;
    FloatingContainer.Children.Add(msiBtn);
    FloatingRoot.Opacity = 0;
    FloatingRoot.Visibility = Visibility.Visible;
    FloatingFlipOver.Begin();
}

void msiBtn_Tapped(object sender, TappedRoutedEventArgs e)
{
    FloatingRoot.Visibility = Visibility.Collapsed;
    FloatingContainer.Children.Clear();
}

これはマウスで使用すると機能しますが、FloatingContainerに追加されたボタンに触れると折りたたまれ、FloatingContainer(ボタンではなく)に触れてもクラッシュすることがあります。バグですか?

4

1 に答える 1

2

崩壊ではなく、墜落を意味したと思いますよね?それが私が見ているものだからです。

ScrollViewersとプロジェクションに関連する既知のバグがあります。公開されているかどうかはわかりませんが、FlipViewにはテンプレートの一部としてScrollViewerが含まれているため、WinRT XAML Toolkit(FlipAnimation)で機能するという回避策の1つがあなたのケースでも機能するようです。基本的に、ScrollViewerのZoomModeを別のものに変更して元に戻す必要があります。そうすれば、クラッシュすることなく機能します。スニペットからコードを修正するために、WinRT XAML Toolkitを参照して、アニメーションの完了後にScrollViewerを抽出し、ZoomModeを前後に変更するのに役立つVisualTreeHelperExtensionsを使用しました。

using WinRTXamlToolkit.Controls.Extensions;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;

namespace App96
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void Test_Click(object sender, RoutedEventArgs e)
        {
            Button msiBtn = new Button();
            msiBtn.Content = "addBtn";
            msiBtn.Width = 100; msiBtn.Height = 50;
            msiBtn.Tapped += msiBtn_Tapped;
            FloatingContainer.Children.Add(msiBtn);
            FloatingRoot.Opacity = 0;
            FloatingRoot.Visibility = Visibility.Visible;
            FloatingFlipOver.Begin();
            FloatingFlipOver.Completed -= FloatingFlipOver_Completed;
            FloatingFlipOver.Completed += FloatingFlipOver_Completed;
        }

        void FloatingFlipOver_Completed(object sender, object e)
        {
            foreach (var sv in FloatingRoot.GetDescendantsOfType<ScrollViewer>())
            {
                sv.ZoomMode = (ZoomMode)(((int)sv.ZoomMode + 1) % 2);
                sv.ZoomMode = (ZoomMode)(((int)sv.ZoomMode + 1) % 2);
            }
        }

        void msiBtn_Tapped(object sender, TappedRoutedEventArgs e)
        {
            FloatingRoot.Visibility = Visibility.Collapsed;
            FloatingContainer.Children.Clear();
        }
    }
}

ツールキット全体が必要ない場合に使用できるVisualTreeHelperExtensionsの関連ビット:

public static class VisualTreeHelperExtensions
{
    public static IEnumerable<T> GetDescendantsOfType<T>(this DependencyObject start) where T : DependencyObject
    {
        return start.GetDescendants().OfType<T>();
    }

    public static IEnumerable<DependencyObject> GetDescendants(this DependencyObject start)
    {
        var queue = new Queue<DependencyObject>();
        var count = VisualTreeHelper.GetChildrenCount(start);

        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(start, i);
            yield return child;
            queue.Enqueue(child);
        }

        while (queue.Count > 0)
        {
            var parent = queue.Dequeue();
            var count2 = VisualTreeHelper.GetChildrenCount(parent);

            for (int i = 0; i < count2; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                yield return child;
                queue.Enqueue(child);
            }
        }
    }
}
于 2013-01-22T04:47:42.187 に答える