更改WP8上按钮边框的颜色时出现延迟
我将一个对象移动到一堆按钮上,当此对象位于按钮上方时,我将更改边框的颜色。 这不是问题,我可以通过绑定,故事板或样式设置器/视觉状态来完成此操作。 当我在我的模拟器上运行它时,它运行的很好,很顺利,但是当我在Windows Phone上运行它时,国家边界发生变化时会有一点滞后。 有没有办法避免这种情况?
1.代码示例
<Button x:Name="Button1" BorderThickness="0" BorderBrush="Transparent">
<Button.Template>
<ControlTemplate x:Name="Control">
<Path x:Name="CountryUser" Style="{StaticResource style_ColorButton}" Data="{Binding UserView.buttonData}" Fill="{StaticResource ButtonBackground}">
<Path.Resources>
<Storyboard x:Name="StoryBoard1">
<ColorAnimation Storyboard.TargetName="User" Storyboard.TargetProperty="(Stroke).(SolidColorBrush.Color)" To="Blue" Duration="0"/>
</Storyboard>
</Path.Resources>
</Path>
</ControlTemplate>
</Button.Template>
和激活
foreach (UIElement x in ElementsAtPoint)
{
f = x as FrameworkElement;
if (f is Path)
{
try
{
h = f as Path;
Storyboard sb = h.Resources["StoryBoard1"] as Storyboard;
sb.Begin();
}
catch
{
}
break;
}
}
额外
仿真器和实际设备之间想到的一个区别是触摸点的准确性。 在模拟器中,您使用具有更高分辨率的鼠标。 在使用手指的设备上,精度要低得多,例如毫米和像素。
我只用一个简单的计数器和一个在manipulation_completed_event中的断点来测试它。 但是在这两种情况下计数是相同的。 它只试图运行故事板一次。
Extra2
为了澄清我看到的滞后:
我拖着一个手指顺滑的元素,当我穿过一个新的按钮时,我拖动的元素停了一会儿。 按钮的颜色被改变,元素再次移动。
当按钮改变颜色后,我移回去。 当我在按钮之间移动时,元素随着我的手指平稳移动。
因此,当故事板被激活时会出现滞后现象,而且我发现拖动的元素无法跟随手指。
因此,我试图在手机上寻找替代方式来改变可能具有更好性能的颜色。 因为它在模拟器上工作正常。
我测试过两款不同的Lumia 920和一款Lumia 520
2.代码示例
在Shawn Kendrot的帮助下使用Visual State Manager,从另一个问题:使用Dependency对象进行彩色动画WP8的复制如下:
<Style x:Key="ButtonStyle" TargetType="Button">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="{StaticResource PhoneForegroundBrush}"/>
<Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
<Setter Property="BorderThickness" Value="{StaticResource PhoneBorderThickness}"/>
<Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilySemiBold}"/>
<Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMedium}"/>
<Setter Property="Padding" Value="10,5,10,6"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid Background="Transparent">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentContainer">
<DiscreteObjectKeyFrame KeyTime="0" Value="White"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground">
<DiscreteObjectKeyFrame KeyTime="0" Value="Orange"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentContainer">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneButtonBasePressedForegroundBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneAccentBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentContainer">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ButtonBackground">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground">
<DiscreteObjectKeyFrame KeyTime="0" Value="Transparent"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="0" Margin="{StaticResource PhoneTouchTargetOverhang}">
<ContentControl x:Name="ContentContainer" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
注意它有一个MouseOver VisualState。 然后分配样式并订阅事件处理程序
<Button Content="Drag over me" Style="{StaticResource ButtonStyle}" MouseEnter="OnButtonMouseEnter" MouseLeave="OnButtonMouseLeave"/>
并在事件处理程序中更改视觉状态。
private void OnButtonMouseEnter(object sender, MouseEventArgs e)
{
VisualStateManager.GoToState((Control)sender, "MouseOver", true);
}
private void OnButtonMouseLeave(object sender, MouseEventArgs e)
{
VisualStateManager.GoToState((Control)sender, "Normal", true);
}
仍然有滞后,任何人都有一个可以测试的解决方案?
额外
由于问题可能是低fps,即当我想改变颜色时出现渲染问题,调度程序是否可以使用?
因此,在我开始创建故事板的第一个代码示例中,我可以调用视图中的函数来使用调度程序? 任何人都有这样做的想法,或者如果这是一个好主意?
欣赏所有的帮助,因为我不明白为什么我可以在屏幕上平滑移动物体,但是当我想改变边界的颜色时,我可以看到它滞后:/
我的应用程序中的动画存在性能问题,并且通常通过将CacheMode
属性设置为BitmapCache
来移动元素来解决这些问题。
这个想法是,它表示框架截取了控件的截图,并将生成的位图存储在GPU的内存中,以便控件不必在每一帧上重绘。
你可以看看这篇文章:CacheMode,以及为什么它更重要的洞察力。
运行连接到调试器时,调试/性能信息是什么?
启用它们在App构造函数的末尾添加以下内容:
// Show graphics profiling information while debugging.
if (Debugger.IsAttached)
{
// Display the current frame rate counters.
Application.Current.Host.Settings.EnableFrameRateCounter = true;
// Show the areas of the app that are being redrawn in each frame.
//Application.Current.Host.Settings.EnableRedrawRegions = true;
// Enable non-production analysis visualization mode,
// which shows areas of a page that are handed off to GPU with a colored overlay.
//Application.Current.Host.Settings.EnableCacheVisualization = true;
// Prevent the screen from turning off while under the debugger by disabling
// the application's idle detection.
// Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run
// and consume battery power when the user is not using the phone.
PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
}
链接地址: http://www.djcxy.com/p/78581.html
上一篇: Lag when changing color of button border on WP8
下一篇: How to fix prettytable to display chinese character properly