选中时扩展 ListViewItem
Extend ListViewItem when selected
我有这个 ListViewItem
触发器:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="Gray"/>
<Setter Property="Background" Value="White"/>
<Setter Property="Height" Value="50"/>
</MultiDataTrigger>
当我选择 ListViewItem
时,此项目变大,因此我可以显示其他元素。
现在我想实现一种行为,即每次单击 ListViewItem
后,此项将从选中变为未选中,因此每次单击后,我的 ListViewItem
会将其高度更改为 50
然后再次单击返回 22
(默认大小)。
我订阅了 PreviewMouseLeftButtonDown
event
:
private void listView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
}
我的问题是:我需要在这个事件处理程序中写入什么?
您可以处理 ListViewItem
容器的 PreviewMouseLeftButtonDown
事件:
<ListView x:Name="listView">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown" />
<Style.Triggers>
<MultiDataTrigger>
...
</MultiDataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
</ListView>
...像这样:
private void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ListViewItem lvi = (ListViewItem)sender;
if (lvi.IsSelected)
{
listView.SelectedItems.Remove(lvi.DataContext);
e.Handled = true;
}
}
I put this EventSetter
after my Style
(this style is in another file) and got this: 'ResourceDictionary' root element requires a x:Class
attribute to support event handlers in the XAML file ...
如果在 ResourceDictionary
中定义 ItemContainerStyle
,则需要向 ResourceDictionary
添加代码隐藏文件。这很容易做到:
Is it possible to set code behind a resource dictionary in WPF for event handling?
另一种选择是在您的视图中使用 EventSetter
内联定义 Style
并将其基于您定义的 Style
和 MultiDataTrigger
在 ResourceDictionary
:
<ListView x:Name="listView">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem" BasedOn="{StaticResource YourOtherStyleInTheResourceDictionary}">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
我有这个 ListViewItem
触发器:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="Gray"/>
<Setter Property="Background" Value="White"/>
<Setter Property="Height" Value="50"/>
</MultiDataTrigger>
当我选择 ListViewItem
时,此项目变大,因此我可以显示其他元素。
现在我想实现一种行为,即每次单击 ListViewItem
后,此项将从选中变为未选中,因此每次单击后,我的 ListViewItem
会将其高度更改为 50
然后再次单击返回 22
(默认大小)。
我订阅了 PreviewMouseLeftButtonDown
event
:
private void listView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
}
我的问题是:我需要在这个事件处理程序中写入什么?
您可以处理 ListViewItem
容器的 PreviewMouseLeftButtonDown
事件:
<ListView x:Name="listView">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown" />
<Style.Triggers>
<MultiDataTrigger>
...
</MultiDataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
</ListView>
...像这样:
private void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ListViewItem lvi = (ListViewItem)sender;
if (lvi.IsSelected)
{
listView.SelectedItems.Remove(lvi.DataContext);
e.Handled = true;
}
}
I put this
EventSetter
after myStyle
(this style is in another file) and got this: 'ResourceDictionary' root element requires ax:Class
attribute to support event handlers in the XAML file ...
如果在 ResourceDictionary
中定义 ItemContainerStyle
,则需要向 ResourceDictionary
添加代码隐藏文件。这很容易做到:
Is it possible to set code behind a resource dictionary in WPF for event handling?
另一种选择是在您的视图中使用 EventSetter
内联定义 Style
并将其基于您定义的 Style
和 MultiDataTrigger
在 ResourceDictionary
:
<ListView x:Name="listView">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem" BasedOn="{StaticResource YourOtherStyleInTheResourceDictionary}">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown" />
</Style>
</ListView.ItemContainerStyle>
</ListView>