Можно ли переопределить набор DependencyProperty вложенного элемента управления в стиле XAML? - PullRequest
0 голосов
/ 13 февраля 2019

Предположим, что существует Control со значением по умолчанию Style, которое я могу использовать только на основе или переопределить.В этом Style есть ControlTemplate, который имеет еще Control и устанавливает Value из DependencyProperty напрямую.

Примерно так:

<Style TargetType="{x:Type ParentControl}" x:Key="Test">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ParentControl}">
                <ChildControl Property="Value" ... />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Теперь я хочу изменить Value из Property в ChildControl без доступа / изменения значения по умолчанию Style.

Если я не ошибаюсь, Foreground из ChildControl нельзя переопределить простым Style-Setter из-за значения Precedence .

<!-- Doesen't Work -->
<Style TargetType="{x:type ChildControl}">
    <Setter Property="Property" Value="Value"/>
</Style>

Но в соответствии с тем же источником, можно было бы переопределить его Animation (если анимация длится вечно).

Прямо здесь, я застрял.Точнее: я не могу переопределить IsDirectionReversed Property вертикали ScrollBar - Track в ScrollViewer.

<ScrollViewer Height="300" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ScrollViewer.Resources>
        <Style TargetType="{x:Type Track}">
            <Style.Triggers>
                <Trigger Property="IsVisible" Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard x:Name="SetValue">
                            <Storyboard Storyboard.TargetProperty="(Track.IsDirectionReversed)">
                                <BooleanAnimationUsingKeyFrames RepeatBehavior="Forever" Duration="24:00:00">
                                    <DiscreteBooleanKeyFrame Value="False" KeyTime="00:00:00"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <StopStoryboard BeginStoryboardName="SetValue"/>
                    </Trigger.ExitActions>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ScrollViewer.Resources>
    <Rectangle Height="800"/>
</ScrollViewer>

Что-то не так с Trigger / Animation?Или поведение Track - Control не меняется, если IsDirectionReversed - Property установлено с помощью Animation?

1 Ответ

0 голосов
/ 13 февраля 2019

Попробуйте определить неявный стиль ScrollBar и поместите стиль Track в словарь Resources этого.Тогда ваш стиль должен быть применен к элементу Track:

<ScrollViewer Height="300" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ScrollViewer.Resources>
        <Style TargetType="ScrollBar">
            <Style.Resources>
                <Style TargetType="{x:Type Track}">
                    <Style.Triggers>
                        <Trigger Property="IsVisible" Value="True">
                            <Trigger.EnterActions>
                                <BeginStoryboard x:Name="SetValue">
                                    <Storyboard Storyboard.TargetProperty="(Track.IsDirectionReversed)">
                                        <BooleanAnimationUsingKeyFrames RepeatBehavior="Forever" Duration="24:00:00">
                                            <DiscreteBooleanKeyFrame Value="False" KeyTime="00:00:00"/>
                                        </BooleanAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </Trigger.EnterActions>
                            <Trigger.ExitActions>
                                <StopStoryboard BeginStoryboardName="SetValue"/>
                            </Trigger.ExitActions>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Style.Resources>
        </Style>
    </ScrollViewer.Resources>
    <Rectangle Height="800" Fill="Red"/>
</ScrollViewer>
...