WP7 Проблемы с визуальным состоянием - PullRequest
3 голосов
/ 19 марта 2011

ОБНОВЛЕНИЕ:

Скачать небольшое тестовое приложение здесь

У меня есть пользовательский элемент управления, состоящий из рамки, кнопки и текстового блока.Когда элемент управления нажат, я отображаю элемент управления всплывающего окна.У меня проблема с использованием визуального состояния для правильного включения и выключения элемента управления.

Когда я обычно включаю и отключаю элемент управления с помощью визуального состояния Normal и Disabled, он работает нормально:

Включено:

Enabled

Отключено:

Disabled

Если щелкнуть элемент управления, отключить элемент управления фон останется белым:

disabled

Есть идеи?

ОБНОВЛЕНИЕ: Я думаю, что мне не хватает свойства в моем визуальном состоянии, которое устанавливается системой.Я надеюсь, что кто-то может определить, что это такое, поэтому я могу переопределить его.

Вот стиль:

<Style
    TargetType="Controls:PickerBoxButton">

    <Setter
        Property="Background"
        Value="Transparent" />

    <Setter
        Property="BorderBrush"
        Value="{StaticResource PhoneForegroundBrush}" />

    <Setter
        Property="Foreground"
        Value="{StaticResource PhoneForegroundBrush}" />

    <Setter
        Property="BorderThickness"
        Value="{StaticResource PhoneBorderThickness}" />

    <Setter
        Property="FontFamily"
        Value="{StaticResource PhoneFontFamilyNormal}" />

    <Setter
        Property="FontSize"
        Value="{StaticResource PhoneFontSizeMediumLarge}" />

    <Setter
        Property="Padding"
        Value="8,3,8,5" />

    <Setter
        Property="Template">

        <Setter.Value>

            <ControlTemplate
                TargetType="Controls:PickerBoxButton">

                <Grid
                    Background="Transparent">

                    <VisualStateManager.VisualStateGroups>

                        <VisualStateGroup
                            x:Name="CommonStates">

                            <VisualState
                                x:Name="Normal">
                                <Storyboard>

                                    <ObjectAnimationUsingKeyFrames
                                        Storyboard.TargetName="ButtonBackground"
                                        Storyboard.TargetProperty="BorderBrush">
                                        <DiscreteObjectKeyFrame
                                            KeyTime="0"
                                            Value="{StaticResource PhoneForegroundBrush}" />
                                    </ObjectAnimationUsingKeyFrames>

                                    <ObjectAnimationUsingKeyFrames
                                        Storyboard.TargetName="PickerButton"
                                        Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame
                                            KeyTime="0"
                                            Value="{StaticResource PhoneTextBoxBrush}" />
                                    </ObjectAnimationUsingKeyFrames>

                                    <ObjectAnimationUsingKeyFrames
                                        Storyboard.TargetName="PickerText"
                                        Storyboard.TargetProperty="Foreground">
                                        <DiscreteObjectKeyFrame
                                            KeyTime="0"
                                            Value="{StaticResource PhoneTextBoxForegroundBrush}" />
                                    </ObjectAnimationUsingKeyFrames>

                                </Storyboard>

                            </VisualState>

                            <VisualState
                                x:Name="Disabled">
                                <Storyboard>

                                    <ObjectAnimationUsingKeyFrames
                                        Storyboard.TargetName="ButtonBackground"
                                        Storyboard.TargetProperty="BorderBrush">
                                        <DiscreteObjectKeyFrame
                                            KeyTime="0"
                                            Value="{StaticResource PhoneDisabledBrush}" />
                                    </ObjectAnimationUsingKeyFrames>

                                    <ObjectAnimationUsingKeyFrames
                                        Storyboard.TargetName="PickerButton"
                                        Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame
                                            KeyTime="0"
                                            Value="{StaticResource PhoneChromeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>

                                    <ObjectAnimationUsingKeyFrames
                                        Storyboard.TargetName="PickerText"
                                        Storyboard.TargetProperty="Foreground">
                                        <DiscreteObjectKeyFrame
                                            KeyTime="0"
                                            Value="{StaticResource PhoneDisabledBrush}" />
                                    </ObjectAnimationUsingKeyFrames>

                                </Storyboard>
                            </VisualState>

                        </VisualStateGroup>

                    </VisualStateManager.VisualStateGroups>

                    <Border
                        x:Name="ButtonBackground"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        CornerRadius="0"
                        Background="{TemplateBinding Background}"
                        Margin="6,8,8,0"
                        >

                        <Button
                            x:Name="PickerButton"
                            BorderThickness="0"
                            Height="64"
                            HorizontalAlignment="Left"
                            Margin="-12,-12,0,-12"
                            VerticalAlignment="Top"
                            Width="700">

                            <StackPanel
                                Orientation="Horizontal"
                                Width="700">
                                <TextBlock
                                    x:Name="PickerText"
                                    Margin="-2, 0, 0, 0"
                                    />
                            </StackPanel>

                        </Button>

                    </Border>

                </Grid>

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

ОБНОВЛЕНИЕ

Добавлен код из контроляпоказывая триггер изменения визуального состояния.

private bool _isReadOnly;
public bool IsReadOnly
{
    get { return _isReadOnly; }
    set
    {
        _isReadOnly = value;

        UpdateVisualState();
    }
}

private void UpdateVisualState()
{
    VisualStateManager.GoToState(this, IsReadOnly ? "Disabled" : "Normal", false);
}

1 Ответ

2 голосов
/ 29 апреля 2011

Из вашего описания вы устанавливаете IsReadOnly в true, но это не заставит элемент управления перейти в состояние Disabled. Вместо этого вы должны установить IsEnabled в False. Не могли бы вы попробовать?

Интересно, сработает ли это ... В конструкторе вашего PickerBoxButton выполните

    this.IsEnabledChanged += (s, e) =>
    {
        if ((bool)e.NewValue)
            VisualStateManager.GoToState((PickerBoxButton)s, "Disabled", true);
    };

и там, где вы устанавливаете свойство IsReadOnly, замените его на

 this.YourCustomControl.IsEnabled = false;


В вашем примере проекта я обнаружил, что при анимации прямоугольника вместо кнопки и текстового блока он действительно работал как ожидалось. Тогда я подозревал, что это может произойти, потому что GoToState запускает изменение визуальных состояний базовых элементов управления, когда они имеют одинаковые имена визуальных состояний. Затем я изменил имена ваших визуальных состояний с «Normal» на «NormalState», «Disabled» на «Disabled», затем все заработало. :)

Также удалите приведенный мною код и используйте исходное свойство IsReadOnly, чтобы вызвать изменение состояния.

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