Ответ 1
Похоже на ошибку. По-видимому, WinRT автоматически поворачивает CacheMode в BitmapCache во время анимации и кэширует объект в низком масштабе. Хотя я не мог воспроизвести то, что вы сейчас видите, у меня была аналогичная проблема в одной из предварительных версий Windows 8 при анимации свойств проецирования TextBlocks. Я думаю, что, скорее всего, он использует самый высокий размер вашего элемента управления, который использовался до начала анимации, для определения значения свойства RenderAtScale, используемого для BitmapCache (который недоступен в WinRT, но существовал в Silverlight или WPF и, похоже, его версия существует в WinRT, он просто не доступен пользователям API). Одним из способов решения этой проблемы может быть как-то незаметно установить значения ScaleX/ScaleY вашего растрового изображения равными 1 при загрузке, а затем вернуться к 0,2 до появления растрового изображения. В качестве альтернативы вы можете иметь прозрачность управления, установленную в 0, и масштабирование до 1 до начала анимации, а затем постепенное уменьшение контроля после анимации шкалы до 0,2. Если вам действительно нужен маленький, который появится перед анимацией - у вас может быть две копии элемента управления - одна маленькая, которая исчезает сразу после начала анимации, а другая, которая начинается большой, но невидимой (или в Opacity = "0.005" ) и очень быстро оживляет Opacity 1, Scale 0.2, когда начинается анимация.
Это выглядело отлично для меня:
<Page
x:Class="App76.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App76"
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="anim"
SpeedRatio="0.2">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)"
Storyboard.TargetName="UIBorder">
<EasingDoubleKeyFrame
KeyTime="0"
Value="0.2">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase
EasingMode="EaseInOut" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame
KeyTime="0:0:1.4"
Value="1">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase
EasingMode="EaseInOut"
Amplitude="3" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)"
Storyboard.TargetName="UIBorder">
<EasingDoubleKeyFrame
KeyTime="0"
Value="0.2">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase
EasingMode="EaseInOut" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame
KeyTime="0:0:1.4"
Value="1">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase
EasingMode="EaseInOut"
Amplitude="3" />
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Page.Resources>
<Grid
Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Grid
x:Name="UIBorder"
Width="555"
HorizontalAlignment="Center"
VerticalAlignment="Center"
RenderTransformOrigin="0.5,0.5">
<!--<Grid.CacheMode>
<BitmapCache
/>
</Grid.CacheMode>-->
<Grid.RenderTransform>
<CompositeTransform
x:Name="ct"
ScaleY="0.2"
ScaleX="0.2" />
</Grid.RenderTransform>
<Grid
Margin="122,0,0,0"
RenderTransformOrigin="0.5,0.5">
<Border
Background="#FF343434"
ManipulationMode="None"
IsDoubleTapEnabled="False"
IsHoldingEnabled="False"
IsRightTapEnabled="False"
IsTapEnabled="False"
RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<CompositeTransform />
</Border.RenderTransform>
</Border>
</Grid>
<Image
HorizontalAlignment="Left"
VerticalAlignment="Center"
Source="ms-appx:///Assets/SplashScreen.png"
Stretch="None" />
</Grid>
<Button
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Content="TEST"
Click="ButtonBase_OnClick" />
</Grid>
</Page>
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace App76
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
ct.ScaleX = 1;
ct.ScaleY = 1;
this.Loaded += MainPage_Loaded;
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
ct.ScaleX = 0.2;
ct.ScaleY = 0.2;
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
anim.Begin();
}
}
}