EventSetter не запускается для ListView, если ItemContainerStyle является стилем - PullRequest
1 голос
/ 24 августа 2011

Относительно n00b к WPF.У меня есть ListView таким образом:

<ListView>
    <ListView.View>
        <GridView>
            ...
        </GridView>
    </ListView.View>
    <ListView.Resources>
        <Style TargetType="{x:Type ListViewItem}">
            <EventSetter Event="MouseDoubleClick" Handler="ItemDoubleClick"/>
        </Style>
    </ListView.Resources>
</ListView>

И в моем app.xaml у меня есть следующие стили:

<Style TargetType="{x:Type ListView}">
    <Setter Property="ItemContainerStyle" Value="{DynamicResource ListViewItemStyle}"/>
</Style>
<Style x:Key="ListViewItemStyle" TargetType="{x:Type ListViewItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListViewItem">
                <Border x:Name="Border" Padding="4">
                    <GridViewRowPresenter x:Name="ItemText" 
                                          TextBlock.FontSize="14" TextBlock.Foreground="{x:Static SystemColors.ControlDarkDarkBrush}"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                </Border>

                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver" Value="True"/>
                            <Condition Property="IsSelected" Value="False"/>
                        </MultiTrigger.Conditions>

                        <Setter TargetName="ItemText" Property="TextBlock.Foreground" Value="{x:Static SystemColors.WindowTextBrush}"/>
                    </MultiTrigger>

                    <Trigger Property="IsSelected" Value="True">
                        <Setter TargetName="Border" Property="Background" Value="{x:Static SystemColors.HighlightBrush}"/>
                        <Setter TargetName="ItemText" Property="TextBlock.Foreground" Value="{x:Static SystemColors.HighlightTextBrush}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Но как только я устанавливаю ItemContainerStyle,двойной щелчок больше не срабатывает.Если я удаляю его, он срабатывает, но мои ListViewItem не имеют стиля.

Что мне здесь не хватает?

Ответы [ 2 ]

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

Ваш локальный ресурс переопределяется стилем ресурсов приложения, который изменяет свойство ItemContainerStyle в ListView. Я бы предложил установить стиль непосредственно на ListView.ItemContainerStyle и основывать стиль на существующем:

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}"
           BasedOn="{StaticResource {x:Type ListViewItem}}">
        <EventSetter Event="MouseDoubleClick" Handler="ItemDoubleClick"/>
    </Style>
</ListView.ItemContainerStyle>

( Это предполагает неявное стилирование, поэтому либо удалите ключ стиля в ресурсах приложения, либо обратитесь к нему напрямую, используя этот ключ в свойстве BasedOn )

0 голосов
/ 24 августа 2011

Чтобы расширить ответ H.B., элемент может иметь неявный стиль или вы можете установить его свойство Style напрямую (то, что я называю явным стилем), но не оба. Как только вы установите свойство Style, скажем, ListViewItem, он больше не будет использовать любые неявные стили, которые у вас есть.

Поскольку ListView.ItemContainerStyle - это просто простой способ установить свойство ListViewItem.Style, он имеет тот же эффект, что и короткое замыкание неявного стиля, который вы определили.

...