如何使用VisualStates在ChildWindow?(How can I use Visual

2019-09-29 15:18发布

有没有办法使用VisualStateManager我ChildWindow子类? 调用VisualStateManager什么也不做,和谷歌上搜索我也隐含实现这一目标是有手动调用故事板的唯一途径。 这是这么多更模糊而且容易出错。 有没有人找到了一种方法来实现呢?

更新了示例代码 。 要使用它,只需要创建一个新的Silverlight项目,并从主页上点击一个按钮调用ExampleWindow.ShowWindow()。 你会看到按钮,即使构造函数应该隐藏按钮的状态。

XAML(ExampleWindow.xaml):

<controls:ChildWindow
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:ic="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"
    x:Class="Client.Windows.ExampleWindow"
    Title="Example">
    <Grid x:Name="LayoutRoot">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="ExampleStateGroup">
                <VisualState x:Name="ExampleBaseState">
                    <Storyboard>
                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="button" Storyboard.TargetProperty="(UIElement.Opacity)">
                            <EasingDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
                        </DoubleAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <VisualStateManager.CustomVisualStateManager>
            <ic:ExtendedVisualStateManager/>
        </VisualStateManager.CustomVisualStateManager>
        <Button x:Name="button" Content="You Shouldn't See Me" Grid.ColumnSpan="2" Width="150" Height="150" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</controls:ChildWindow>

后面的代码(ExampleWindow.xaml.cs):

using System.Windows;
using System.Windows.Controls;

namespace Client.Windows
{
    public partial class ExampleWindow : ChildWindow
    {
        public ExampleWindow()
        {
            InitializeComponent();

            VisualStateManager.GoToState( this, "ExampleBaseState", true );
        }

        public static void ShowWindow()
        {
            var w = new ExampleWindow();
            w.Show();
        }
    }
}

Answer 1:

检查这篇文章使用视觉状态管理与Silverlight工具包的子窗口控制



Answer 2:

到目前为止,我已经找到了唯一的解决方法就是把任何事情需要可视状态为用户控件。 该用户控件也有状态,并成功地在它们之间进行切换,并通过事件,方法和属性通信所必需的任何的ChildWindow。



Answer 3:

我经历了同样的问题与VSM不ChildWindows工作作为多夫。 我所做的是改变我ChildWindow成用户控件,然后设置用户控件作为一个通用的ChildWindow打开它之前的内容。

var childWindow = new ChildWindow { Content = someUserControl };

现在的问题是,因为你的代码behing将在用户控件你失去了ChildWindow类的DialogResult的功能。 访问ChildWindow的DialogResult属性最简单的方法是只使用用户控件的内部parent属性。



Answer 4:

该ChildWindow模板包含管理常用的子窗口动画的VisualStateGroup“CommonStates”一VisualStateManager。 当调用VisualStateManager.GoToState它正在寻找在ChildWindow模板CommonStates VisualStateGroup的状态。 所以,你需要访问ExtendedVisualStateManager和VisualStateGroup“ExampleStateGroup”你已经在ChildWindow创建。 我发现这样做的唯一方法(这是一个hackaround的有点)是创建自己的GotoState函数函数被调用的状态变化。

public ExampleWindow()
{
    InitializeComponent();

    MyGoToState("ExampleBaseState");
}

public void MyGoToState(string stateIn)
{

    VisualState stateShow = null;

    VisualStateGroup ExampleStateGroup as VisualStateGroup  

    if(ExampleStateGroup != null)
    {
        for(int i= 0; i < ExampleStateGroup.States.Count; i++)
        {
            stateShow = ExampleStateGroup.States[i] as VisualState;

            if(stateShow != null)
            {

                if(stateShow.Name == stateIn.Trim())
                {
                    stateShow.Storyboard.Begin();
                }

            }

         }
    }
}


文章来源: How can I use VisualStates in a ChildWindow?