Триггеры WPF: изменение стиля элемента управления вне области видимости в триггере - PullRequest
1 голос
/ 08 марта 2009

Я не могу найти решение этой проблемы в XAML:

Я хочу анимировать ширину правой кнопки до определенного значения, когда IsMouseOver левой кнопки имеет значение true. Я не знаю, где это разместить: в стиле или шаблоне одной из кнопок или в стиле на сетке. Это вообще возможно?

<Border Style="{StaticResource ContentBodyStyle}" x:Name="Border" >
    <Grid Width="Auto" Height="Auto" Style="{DynamicResource GridStyle1}">
        <Grid.ColumnDefinitions>
        <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Button Margin="0,0,0,0" Content="Button" Grid.Row="0" x:Name="BtnLeft" Style="{DynamicResource ButtonStyle1}"/>
        <Button Margin="0,0,0,0" Content="Button" Grid.Column="1" x:Name="BtnRight" Width="0"/>
    </Grid>
</Border>

Спасибо

1 Ответ

3 голосов
/ 08 марта 2009

Я не уверен, что вы можете установить свойства для элементов управления вне области действия элемента управления с назначенным ему стилем. Даже если это возможно, это кажется неправильным. В вашем сценарии вы можете использовать триггеры событий и раскадровки, определенные везде, где они будут видны обеим кнопкам. Вот пример того, как изменить BtnLeft, хотя я бы предпочел расположить раскадровки немного дальше вверх по дереву, чтобы при необходимости их можно было использовать повторно:

<Button Margin="0,0,0,0" Content="Button" Grid.Row="0" x:Name="BtnLeft" Style="{DynamicResource ButtonStyle1}">
    <Button.Resources>
        <Storyboard x:Key="OnMouseEnter1">
            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                Storyboard.TargetName="BtnRight"
                Storyboard.TargetProperty="Width">
                <SplineDoubleKeyFrame KeyTime="00:00:00.5" Value="75"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
        <Storyboard x:Key="OnMouseLeave1">
            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
                Storyboard.TargetName="BtnRight" 
                Storyboard.TargetProperty="Width">
                <SplineDoubleKeyFrame KeyTime="00:00:00.5" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </Button.Resources>
    <Button.Triggers>
        <EventTrigger RoutedEvent="Mouse.MouseEnter" SourceName="BtnLeft">
            <BeginStoryboard Storyboard="{StaticResource OnMouseEnter1}"/>
        </EventTrigger>
        <EventTrigger RoutedEvent="Mouse.MouseLeave" SourceName="BtnLeft">
            <BeginStoryboard Storyboard="{StaticResource OnMouseLeave1}"/>
        </EventTrigger>
    </Button.Triggers>
</Button>

Вместо свойства IsMouseOver вы можете использовать события MouseEnter и MouseLeave. Это должно дать вам ту же функциональность.

Edit: свойство SourceName может быть опущено из EventTrigger, когда этот триггер определен в области действия кнопки.

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