Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > VisualStates и UserControl


Автор: sameness 28.4.2011, 17:49
Все привет!)
Кто нибудь, подскажите плиз!! уже замучался бороться, хочется сделать как надо, но не получается..
Пытаюсь создать свой пользовательский элемент управления, который должен иметь несколько визуальных состояний. Но никак не получается это сделать, вот что я делаю:
Код

<ContentControl x:Class="TestVSM.UserControl1"
             xmlns:thisApp="clr-namespace:TestVSM"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             Style="{DynamicResource UserControlStyle}">
    <ContentControl.Resources>
        <Style x:Key="UserControlStyle" TargetType="ContentControl">
            <Setter Property="Background" Value="Lavender"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ContentControl">
                        <Grid>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="MyGroup">
                                    <VisualState x:Name="State1">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="UserControlContent" Storyboard.TargetProperty="(Content).Children[0].(UIElement.Visibility)">
                                                <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="Visible"/>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="UserControlContent" Storyboard.TargetProperty="(Content).Children[1].(UIElement.Visibility)">
                                                <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="Collapsed"/>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="State2">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="UserControlContent" Storyboard.TargetProperty="(Content).Children[1].(UIElement.Visibility)">
                                                <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="Visible"/>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="UserControlContent" Storyboard.TargetProperty="(Content).Children[0].(UIElement.Visibility)">
                                                <DiscreteObjectKeyFrame KeyTime="0:0:0" Value="Collapsed"/>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Border Background="{TemplateBinding Background}"/>
                            <ContentPresenter x:Name="UserControlContent"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ContentControl.Resources>
    <StackPanel x:Name="LayoutRoot">
        <TextBlock x:Name="State1" Text="Hello from State1"/>
        <TextBlock x:Name="State2" Text="Hello from State2"/>
    </StackPanel>
</ContentControl>


Теперь то что называется Code Behind:
Код

namespace TestVSM
{
    [TemplateVisualState(GroupName = "MyGroup", Name = "State1")]
    [TemplateVisualState(GroupName = "MyGroup", Name = "State2")]
    public partial class UserControl1 : ContentControl
    {
        public UserControl1()
        {
            InitializeComponent();

            this.LayoutUpdated += new EventHandler(UserControl1_LayoutUpdated);
        }

        void UserControl1_LayoutUpdated(object sender, EventArgs e)
        {
            VisualStateManager.GoToState(this, "State1", false);
            this.LayoutUpdated -= this.UserControl1_LayoutUpdated;
        }
    }
}


вот..
подскажите что делать?!!smile

Автор: -Mikle- 28.4.2011, 20:13
Немного не тем путем идешь. http://msdn.microsoft.com/ru-ru/library/cc295235.aspx

Автор: sameness 29.4.2011, 19:13
не совсем понял чем мне это поможет..
меня интересует лишь как добиться смены состояний (которые я сам и опишу) через VisualStateManager.
В данный момент вызывается исключение:
Цитата

Не удается анимировать свойство "Visibility" для "System.Windows.Controls.TextBlock" с помощью "System.Windows.Media.Animation.ObjectAnimationUsingKeyFrames"

Здесь видно, что свойство Visibility понимается и правильно распознается тип объекта TextBlock, но применить свойство не получается, интересно почему..

Автор: -Mikle- 29.4.2011, 19:44
Если поиграться хочешь, то пиши так:
Код

....
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"/>
....
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Collapsed}"/>
....


Цитата(sameness @  28.4.2011,  20:49 Найти цитируемый пост)
хочется сделать как надо, но не получается..
Пытаюсь создать свой пользовательский элемент управления

Но если хочешь именно так как ты написал, то читай ссылку, потому что ТАК CustomControl'ы не пишутся.

Автор: sameness 30.4.2011, 18:17
Благодарю за помощь!smile
Не понял только, почему иногда можно напрямую использовать члены перечисления Visibility (например при переопределении поведения какого нибудь элемента управления, например MouseOver для Button) а иногда, как в данном случае через {x:Static Visibility.Visible}

Автор: -Mikle- 30.4.2011, 21:25
Потому что в одном случае, XAML-процессору известен тип, в который надо сконвертировать строку, а DiscreteObjectKeyFrame работаетс типом object.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)