Отдельное событие в контроле - PullRequest
2 голосов
/ 04 августа 2011

Мне интересно, могу ли я иметь отдельный компонент в элементе управления, иметь событие.Например, я создал свой собственный элемент управления, и с помощью VisualStateManager я могу обрабатывать несколько событий, которые срабатывают для элемента управления в целом, я бы хотел, чтобы только моя кнопка переключения в элементе управления запускала событие наведения мыши.В настоящее время любая область элемента управления, над которой находится мышь, запускает указатель мыши, который разрушает эффект колоранимации, который я пытаюсь получить. Я хочу, чтобы колоранимация происходила только при наведении курсора на кнопку управления, в моем элементе управления присутствует содержимое, позволяющеесодержание, я не хочу, чтобы этот фрагмент вызывал событие.

Пример того, о чем я говорю ниже, в файле generic.xaml.

<Style TargetType="local:MyControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:MyControl">
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="ViewStates">

                            <VisualState x:Name="Expanded">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="ContentScaleTransform" Storyboard.TargetProperty="ScaleY" To="1" Duration="0"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Collapsed">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="ContentScaleTransform" Storyboard.TargetProperty="ScaleY" To="0" Duration="0"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <!-- This fires for any part of the control, is it possible to just create a mouseover for the ToggleButton below? -->
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="{TemplateBinding CornerRadius}" Background="{TemplateBinding Background}">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                            <Grid Margin="3">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <ToggleButton Grid.Column="0" Content="{TemplateBinding HeaderContent}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  RenderTransformOrigin="0.5,0.5" Margin="1" x:Name="ExpandCollapseButton">

                                </ToggleButton>
                            </Grid>
                            <ContentPresenter Grid.Row="1" Margin="5" Content="{TemplateBinding Content}" x:Name="Content">
                                <ContentPresenter.RenderTransform>
                                    <ScaleTransform x:Name="ContentScaleTransform"/>
                                </ContentPresenter.RenderTransform>
                            </ContentPresenter>
                        </Grid>
                    </Border>

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

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Боб, Вы можете получить доступ к кнопке переключения из своего класса следующим образом:

ToggleButton myToggleButton = GetTemplateChild ("toggleButton") as ToggleButton;

Создайте события, которые вы хотите в своем классе. Возможно, вам придется переопределить метод OnApplyTemplate и создать там свое событие. Я все еще исследую эту часть и пока не до конца ее понимаю, вам придется поиграть с ней. Я переопределил свой OnApplyTemplate, и он работал для меня.

ToggleButton myToggleButton;
public override void OnApplyTemplate() {
    base.OnApplyTemplate();
    myToggleButton = GetTemplateChild("toggleButton") as ToggleButton;
    myToggleButton.MouseEnter += new MouseEventHandler(myToggleButton_MouseEnter);
}
void myToggleButton_MouseEnter(object sender, MouseEventArgs e) {
        VisualStateManager.GoToState(this, "MouseEnter", true);
    }

Также убедитесь, что ваш шаблон установлен вверху:

[TemplateVisualState(Name = "MouseEnter", GroupName = "ViewStates")]

VisualState может существовать в файле generic.xaml, в котором вы настраиваете другие ваши визуальные состояния, и не должен находиться во внутренней ToggleButton.

<VisualState x:Name="MouseEnter">
    <Storyboard>
        <ColorAnimation Storyboard.TargetName="toggleButton" Storyboard.TargetProperty="(ToggleButton.SomeProperty).(SolidColorBrush.Color)" To="SomeColor"/>
    </Storyboard>
</VisualState>
1 голос
/ 04 августа 2011

Прежде всего, давайте вернем нашу терминологию, вы не говорите о «событиях», вы говорите о «визуальных состояниях».«MouseOver» - это визуальное состояние.Ответственность за определение того, в каком из визуальных состояний находится в элементе управления, лежит на коде.

Обычно код в элементе управления будет использовать события MouseEnter и MouseLeave, чтобы установить логическое значение, указывающее, что мышь находится надcontrol, а затем вызовите некоторый UpdateStates метод, в который разработчик включит логику, чтобы определить, в каких визуальных состояниях должен быть элемент управления в данный момент.

В вашем случае вместо использования элементов управления MouseEnter и MouseLeaveсобытия прикрепляют эти обработчики к вашему внутреннему ToggleButton.

...