Windows 8 触摸FlipView时会崩溃

Windows 8 触摸FlipView时会崩溃,windows-8,microsoft-metro,windows-runtime,winrt-xaml,windows-store-apps,Windows 8,Microsoft Metro,Windows Runtime,Winrt Xaml,Windows Store Apps,在Windows应用商店应用程序中 XAML 当与鼠标一起使用时,此功能有效, 但当我触摸浮动容器中添加的按钮时,它会崩溃, 有时,即使我触摸浮动容器(而不是按钮),它也会崩溃。 这是一个bug吗?我想你指的是崩溃,不是崩溃,对吧?因为这就是我所看到的 存在与ScrollViewer和投影相关的已知错误。我不确定是否公开讨论过,但我听说WinRT XAML Toolkit(在FlipAnimation中)中适用于我的一个变通方法似乎也适用于您的情况,因为FlipView的模板中有一个Scroll

在Windows应用商店应用程序中

XAML

当与鼠标一起使用时,此功能有效, 但当我触摸浮动容器中添加的按钮时,它会崩溃, 有时,即使我触摸浮动容器(而不是按钮),它也会崩溃。
这是一个bug吗?

我想你指的是崩溃,不是崩溃,对吧?因为这就是我所看到的

存在与ScrollViewer和投影相关的已知错误。我不确定是否公开讨论过,但我听说WinRT XAML Toolkit(在FlipAnimation中)中适用于我的一个变通方法似乎也适用于您的情况,因为FlipView的模板中有一个ScrollViewer。基本上,您需要将ScrollViewer的ZoomMode更改为其他内容并返回,然后它就可以正常工作而不会崩溃。为了修复代码片段中的代码,我引用了WinRT XAML Toolkit,使用VisualTreeHelperExtensions来帮助提取ScrollViewer,并在动画完成后来回更改ZoomMode,如下所示:

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();
        }
    }
}
使用WinRTXamlToolkit.Controls.Extensions;
使用Windows.UI.Xaml;
使用Windows.UI.Xaml.Controls;
使用Windows.UI.Xaml.Input;
名称空间App96
{
公共密封部分类主页面:第页
{
公共主页()
{
this.InitializeComponent();
}
私有无效测试\u单击(对象发送器,路由目标e)
{
按钮msiBtn=新按钮();
msiBtn.Content=“addBtn”;
msiBtn.宽度=100;msiBtn.高度=50;
msiBtn.Tapped+=msiBtn_Tapped;
FloatingContainer.Children.Add(msiBtn);
FloatingRoot.Opacity=0;
FloatingRoot.Visibility=可见性.Visibility;
浮动翻转。开始();
FloatingFlipOver.Completed-=FloatingFlipOver\u Completed;
FloatingFlipOver.Completed+=FloatingFlipOver\u Completed;
}
无效浮动翻转完成(对象发送器,对象e)
{
foreach(FloatingRoot.getDegenantSoftype()中的var sv)
{
sv.ZoomMode=(ZoomMode)((int)sv.ZoomMode+1)%2);
sv.ZoomMode=(ZoomMode)((int)sv.ZoomMode+1)%2);
}
}
无效msiBtn_抽头(对象发送器,抽头路由数据源)
{
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);
            }
        }
    }
}
公共静态类VisualTreeHelperExtensions
{
公共静态IEnumerable GetDegenantSoftType(此DependencyObject开始),其中T:DependencyObject
{
返回()类型的start.getsubjects();
}
公共静态IEnumerable GetDescents(此DependencyObject开始)
{
var queue=新队列();
var count=VisualTreeHelper.GetChildrenCount(开始);
for(int i=0;i0)
{
var parent=queue.Dequeue();
var count2=VisualTreeHelper.GetChildrenCount(父级);
对于(int i=0;i
这是解决一个非常痛苦的错误的好办法。在我的情况下,我们只需要设置可见性并重置。谢谢!这个问题使我的整个应用程序崩溃,只是抛出了一条非常模糊的错误消息。你的解决方案完全解决了这个问题——很好。奇怪的是,在早期的Tianium SDK中,我曾经遇到过一个几乎相同的问题——必须等待SDK更新才能修复这个问题!
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();
        }
    }
}
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);
            }
        }
    }
}