如何在XAML C#Windows应用程序中以编程方式更改控件的ScaleY RenderTransform?

时间:2015-08-26 01:33:28

标签: c# xaml animation visual-studio-2015

我有以下xaml代码的几个实例。基本上它是一堆网格,以小的(24像素高)状态显示在堆叠面板中,显示文本块的一行。当您单击箭头图像(或者更确切地说是图像周围的边框,因为图像中有透明度)时,网格会展开以显示其中的所有细节。我总共有15个这样的人:

<Grid x:Name="borLecSec1" Style="{StaticResource SearchedSectionGrid}">
    <TextBlock x:Name="txtLecSec1" Style="{StaticResource SearchedSectionText}" 
               PointerEntered="SearchSectionEntered" PointerExited="SearchSectionExited" 
               Tapped="SearchSectionTapped"/>

    <Border x:Name="backArrowSection_Lec_1" Style="{StaticResource ExpandSectionButton}" 
            PointerEntered="backArrowSectionEnter" PointerExited="backArrowSectionExit" 
            Tapped="backArrowSectionTapped">

        <Image x:Name="arrowSection_Lec_1" Style="{StaticResource ExpandSectionImage}">
            <Image.RenderTransform>
                <CompositeTransform ScaleY="1"/>
            </Image.RenderTransform>
        </Image>

    </Border>
</Grid>

我还没弄明白如何让网格自动扩展,因为它们必须从24像素变为自动,而我还没有开始工作。我的工作是点击时,此箭头垂直翻转,现在它表示另一次点击将导致网格崩溃。这个动画的故事板是这样的:

<Storyboard x:Name="SearchSectionArrowExpand">
    <DoubleAnimation  Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" 
                      From="1" To="-1" Duration="00:00:0.15"/>
</Storyboard>

<Storyboard x:Name="SearchSectionArrowCollapse">
    <DoubleAnimation  Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" 
                      From="-1" To="1" Duration="00:00:0.15"/>
</Storyboard>

由于此箭头图像控件有很多实例,故事板的目标属性在C#代码后面的每个Begin()语句之前都会更改。我的代码如下。其中,work_grid和working_image对象分别对应于上面的xaml中的borLecSec1和arrowSection_Lec_1。

if (working_grid.Height == 24)
{
    System.Diagnostics.Debug.WriteLine("expand");
    working_grid.Height = double.NaN;

    SearchSectionArrowCollapse.Stop();
    SearchSectionArrowExpand.Stop();

    Storyboard.SetTargetName(SearchSectionArrowExpand, working_image_name);
    SearchSectionArrowExpand.Begin();
}

代码的崩溃部分在随后的其他部分非常相似。 Stop()命令是必要的,因为如果他们不知道在重新定位之前必须停止根故事板,我会收到错误。所以我所说的一切都很好。不起作用的是,如果我展开第一个网格,那么arrowSection_Lec_1的ScaleY为-1,如果我然后展开第二个网格给arrowSection_Lec_2一个ScaleY为-1,则第一个图像恢复为具有即使其相应的网格仍然展开,ScaleY为1。

我想到的解决方案是让故事板Completed事件明确地设置相应箭头的ScaleY,这样即使故事板再次针对不同的箭头运行,它也会保持这个位置。我无法弄清楚如何在C#中引用这个属性。

为了清楚起见,我的问题是如何将arrowSection_Lec_1的ScaleY变换设置为-1来自后面的代码?

1 个答案:

答案 0 :(得分:0)

以下是如何从代码隐藏中访问Scale:

var transform = (CompositeTransform)arrowSection_Lec_1.RenderTransform;
transform.ScaleY = -1;