gpt4 book ai didi

c# - XAML 定义的 StoryBoard 在 C 中调用时抛出空指针

转载 作者:行者123 更新时间:2023-11-30 14:10:08 25 4
gpt4 key购买 nike

我正在尝试为一个按钮设置动画,以便在用户触摸它时图像会放大,并在他释放它时恢复正常,但是 XAML 定义的 StoryBoard 在 C# 中调用时会以某种方式抛出空指针。我的代码片段在这里,我完全不知道是什么导致了这个问题。

XAML:

<UserControl x:Class="Mavie_Base.GUIElements.MenuButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
d:DesignHeight="200" d:DesignWidth="140">

<UserControl.Resources>
<Storyboard x:Name="Enlarge">
<DoubleAnimation Duration="0:0:1" From="60" To="66" Storyboard.TargetProperty="Height" Storyboard.TargetName="Rectangle"/>
</Storyboard>
<Storyboard x:Name="Normalize">
<DoubleAnimation Duration="0:0:1" From="66" To="60" Storyboard.TargetProperty="Height" Storyboard.TargetName="Rectangle"/>
</Storyboard>
</UserControl.Resources>
....
</UserControl>

C#:

private void IconContainer_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
Enlarge.Begin();
}

private void IconContainer_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
Normalize.Begin();
}

最佳答案

+1 @thumbmunkeys

虽然如果是我,这听起来像是您以后可能想要添加其他东西以进行交互的东西,所以我只是让已经内置的功能来处理它,然后如果您想要的话,可以在以后添加其他东西添加其他东西到它的功能。我还认为(不是肯定的,必须检查)如果你去修补 height 属性,它可能会抵消屏幕上布局的其他工件,因为它会调整导致一个跳跃的 UI,这对用户来说不是很愉快.

再一次,如果是我,我可能会做这样的事情。首先,不要摆弄可能会插入屏幕其他部分的高度/宽度属性,而是点击 ScaleTransform.ScaleY(和 ScaleX 分别,你会想玩我的值一定要得到你想要的尺寸。)为你的尺寸变化。

我也可能会继续将它变成一个“lookless”并剥离 Button 以便稍后使用其他选项并处理我的事件,如 Pressed。类似的东西;

<Style x:Key="GrowOnPressedThingy" TargetType="Button">        
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid x:Name="Container"
RenderTransformOrigin="0.5,0.5">
<Grid.RenderTransform>
<TransformGroup>
<ScaleTransform />
<SkewTransform />
<RotateTransform />
<TranslateTransform />
</TransformGroup>
</Grid.RenderTransform>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<!-- Just left for reference -->
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver"/>
<VisualState x:Name="Pressed">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="Container"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
<EasingDoubleKeyFrame KeyTime="0:0:0.01" Value="1.05" />
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="Container"
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
<EasingDoubleKeyFrame KeyTime="0:0:0.01" Value="1.05" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled"/>
</VisualStateGroup>
<VisualStateGroup x:Name="FocusStates">
<VisualState x:Name="Focused"/>
<VisualState x:Name="Unfocused" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>

<ContentControl x:Name="contentPresenter"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
IsTabStop="False"/>

</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

这样你就可以快速...;

<Button Content="whatever/image/path/blah.png" 
Style="{StaticResource GrowOnPressedThingy}"/>

...无论您需要什么,您都可以轻松添加您将来可能想到的其他简洁的 UI 技巧。只是盲目尝试,但也许值得考虑。

无论如何,希望这对您有所帮助。干杯

关于c# - XAML 定义的 StoryBoard 在 C 中调用时抛出空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25509148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com