Windows 8 触摸FlipView时会崩溃
在Windows应用商店应用程序中 XAML 当与鼠标一起使用时,此功能有效, 但当我触摸浮动容器中添加的按钮时,它会崩溃, 有时,即使我触摸浮动容器(而不是按钮),它也会崩溃。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
这是一个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);
}
}
}
}