Применить EventTrigger для GridView Row в WPF? - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу применить MouseEnter и MouseLeave EventTriggers ко всей строке WPF GridView. Я использовал приведенный ниже код, чтобы добавить триггеры событий в один столбец, и они срабатывают при наведении мыши на текст в этом столбце.

<ListView x:Name="MyList" ItemsSource="{Binding listItems}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Tag" Width="100" >
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Tag}" Foreground="{Binding ForegroundColor}">
                                <i:Interaction.Triggers>
                                    <i:EventTrigger EventName="MouseEnter">
                                        <i:InvokeCommandAction Command="{Binding Path=MouseEnterCommand}"/>
                                    </i:EventTrigger>
                                    <i:EventTrigger EventName="MouseLeave">
                                        <i:InvokeCommandAction Command="{Binding Path=MouseLeaveCommand}"/>
                                    </i:EventTrigger>
                                </i:Interaction.Triggers>
                            </TextBlock>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Description" Width="300" DisplayMemberBinding="{Binding Description}"/>
                <GridViewColumn Header="Qty" Width="80" DisplayMemberBinding="{Binding Qty}"/>
            </GridView>
        </ListView.View>
    </ListView>

Вместо того, чтобы реплицировать один и тот же код триггера в каждом шаблоне CellTemplate, существует более чистый способ применения триггеров ко всей строке, чтобы при вводе или выходе любой области в этой строке события уволены?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Я не могу добавлять комментарии, поэтому я добавляю дополнительную информацию здесь. Как listview, он отображает все свои элементы в ListViewItem, а ListViewItem содержит DataGridRow, поэтому вы можете изменить стиль listviewItem или изменить DataGridRow Datatemplate, но я думаю, что предпочтительным вариантом будет изменить listviewItem, как мой ответ выше. И следующее - это отношения ListViewItem и DataGridRow. enter image description here

0 голосов
/ 07 ноября 2018

Если вы хотите применить MouseEnter и MouseLeave EventTriggers ко всей строке списка, то вы можете переписать стиль ListviewItem, например:

   <Style x:Key="ListViewItemFocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle RadiusY="2" RadiusX="2" Stroke="#8E6EA6F5" StrokeThickness="1"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <LinearGradientBrush x:Key="ListItemHoverFill" EndPoint="0,1" StartPoint="0,0">
        <GradientStop Color="#FFF1FBFF" Offset="0"/>
        <GradientStop Color="#FFD5F1FE" Offset="1"/>
    </LinearGradientBrush>
    <LinearGradientBrush x:Key="ListItemSelectedFill" EndPoint="0,1" StartPoint="0,0">
        <GradientStop Color="#FFD9F4FF" Offset="0"/>
        <GradientStop Color="#FF9BDDFB" Offset="1"/>
    </LinearGradientBrush>
    <LinearGradientBrush x:Key="ListItemSelectedInactiveFill" EndPoint="0,1" StartPoint="0,0">
        <GradientStop Color="#FFEEEDED" Offset="0"/>
        <GradientStop Color="#FFDDDDDD" Offset="1"/>
    </LinearGradientBrush>
    <LinearGradientBrush x:Key="ListItemSelectedHoverFill" EndPoint="0,1" StartPoint="0,0">
        <GradientStop Color="#FFEAF9FF" Offset="0"/>
        <GradientStop Color="#FFC9EDFD" Offset="1"/>
    </LinearGradientBrush> 
    <Style x:Key="ListViewItemStyle1" TargetType="{x:Type ListViewItem}">
        <Setter Property="FocusVisualStyle" Value="{StaticResource ListViewItemFocusVisual}"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Margin" Value="0,0,0,1"/>
        <Setter Property="Padding" Value="5,2,5,2"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="2" SnapsToDevicePixels="true">
                        <Border x:Name="InnerBorder" BorderThickness="1" CornerRadius="1">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition MaxHeight="11"/>
                                    <RowDefinition/>
                                </Grid.RowDefinitions>
                                <Rectangle x:Name="UpperHighlight" Fill="#75FFFFFF" Visibility="Collapsed"/>
                                <GridViewRowPresenter Grid.RowSpan="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            </Grid>
                        </Border>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="Background" Value="{StaticResource ListItemHoverFill}"/>
                            <Setter Property="BorderBrush" Value="#FFCCF0FF"/>
                            <Setter Property="Visibility" TargetName="UpperHighlight" Value="Visible"/>
                        </Trigger>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Background" Value="{StaticResource ListItemSelectedFill}"/>
                            <Setter Property="BorderBrush" Value="#FF98DDFB"/>
                            <Setter Property="BorderBrush" TargetName="InnerBorder" Value="#80FFFFFF"/>
                            <Setter Property="Visibility" TargetName="UpperHighlight" Value="Visible"/>
                            <Setter Property="Fill" TargetName="UpperHighlight" Value="#40FFFFFF"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="Selector.IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="{StaticResource ListItemSelectedInactiveFill}"/>
                            <Setter Property="BorderBrush" Value="#FFCFCFCF"/>
                        </MultiTrigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="IsMouseOver" Value="true"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="{StaticResource ListItemSelectedHoverFill}"/>
                            <Setter Property="BorderBrush" Value="#FF98DDFB"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
...