Как я могу использовать VisualStates в ChildWindow? - PullRequest
1 голос
/ 22 января 2010

Есть ли способ использовать VisualStateManager с моим подклассом ChildWindow? Вызовы VisualStateManager ничего не делают, и поиск в Google, который я делал, подразумевал, что единственный способ добиться этого - это ручные вызовы раскадровок. Это так неряшливо и подвержено ошибкам. Кто-нибудь нашел способ добиться этого?

Обновлено с примером кода . Чтобы использовать его, просто создайте новый проект 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();
        }
    }
}

Ответы [ 4 ]

1 голос
/ 01 октября 2010
0 голосов
/ 22 июня 2014

Шаблон ChildWindow содержит VisualStateManager, который управляет VisualStateGroup "CommonStates" для общих анимаций дочерних окон. Когда вы вызываете VisualStateManager.GoToState, он ищет состояние в шаблоне ChildWindow CommonStates VisualStateGroup. Итак, вам нужно получить доступ к ExtendedVisualStateManager и VisualStateGroup «ExampleStateGroup», которые вы создали в ChildWindow. Единственный способ сделать это (что-то вроде взлома) - создать собственную функцию 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();
                }

            }

         }
    }
}
0 голосов
/ 24 февраля 2010

У меня возникла та же проблема с VSM, не работающим в ChildWindows, как Dov. Что я сделал, так это изменил свое ChildWindow на UserControl, а затем установил UserControl в качестве содержимого универсального ChildWindow перед его открытием.

var childWindow = new ChildWindow { Content = someUserControl };

Проблема теперь в том, что вы теряете функциональность DialogResult класса ChildWindow, так как ваш код будет находиться в UserControl. Самый простой способ получить доступ к свойству DialogResult объекта ChildWindow - просто использовать свойство Parent внутри UserControl.

0 голосов
/ 25 января 2010

Пока что единственный найденный мной обходной путь - это поместить в UserControl все, что требует визуальных состояний. UserControl может иметь состояния и успешно переключаться между ними, а также передавать все, что нужно ChildWindow, через события, методы и свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...