我希望通过Border
为Trigger
设置样式,以响应被拖动而不是简单的鼠标悬停。
更具体地说,我们有一个项目列表,显示硬件端口(如端口1,端口2等),然后是它旁边的设备,即连接到该端口的设备。对于正常的鼠标悬停事件,我们希望突出显示设备。但是,如果我们处于拖放操作中,我们想要突出显示端口。
例如,这里有一些虚假的MultiTriggers描述了我想做的事情。它使用了一个名为IsDragInProgress
的虚假属性,我为这个例子做了补充。这就是我想要实现的目标。
<DataTemplate x:Key="TestTemplate">
<DockPanel>
<Border x:Name="PortHighlight" DockPanel.Dock="Left">
<TextBlock>
<Run Text="{Binding PortName}" />
<Run Text=": " />
</TextBlock>
</Border>
<Border x:Name="DeviceHighlight">
<TextBlock Text="{Binding DeviceName}" />
</Border>
</DockPanel>
<DataTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="IsDragInProgress" Value="False" />
</MultiTrigger.Conditions>
<Setter TargetName="DeviceHighlight" Property="Background" Value="Yellow" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="IsDragInProgress" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="PortHighlight" Property="Background" Value="Yellow" />
</MultiTrigger>
</DataTemplate.Triggers>
</DataTemplate>
那可以这样做吗?我可以用任何现有的财产来代替人造IsDragInProgress
吗?
答案 0 :(得分:0)
您可以使用DataTrigger。您将在viewmodel中创建IsDragInProgress属性。然后,当拖动开始和结束时,您必须打开/关闭该属性。
编辑:
<Grid x:Name="LayoutRoot">
<Border x:Name="border" AllowDrop="True" Drop="border_Drop" DragEnter="border_DragEnter" DragLeave="border_DragLeave" Background="White"></Border>
<Ellipse Height="50" Width="50" Fill="Green" MouseMove="Ellipse_MouseMove" />
</Grid>
在codebehind中:
private void Ellipse_MouseMove(object sender, MouseEventArgs e)
{
Ellipse ellipse = sender as Ellipse;
if (ellipse != null && e.LeftButton == MouseButtonState.Pressed)
{
DragDrop.DoDragDrop(ellipse,
ellipse.Fill.ToString(),
DragDropEffects.Copy);
}
}
private void border_DragEnter(object sender, DragEventArgs e)
{
border.Background = new SolidColorBrush(Colors.Blue);
}
private void border_DragLeave(object sender, DragEventArgs e)
{
border.Background = new SolidColorBrush(Colors.White);
}
private void border_Drop(object sender, DragEventArgs e)
{
border.Background = new SolidColorBrush(Colors.White);
}
在我的简短测试中,这似乎非常可靠。而不是更改背景颜色,而是更改viewmodel上的属性(反过来触发DataTrigger)。
祝你好运!