C# 使用ismouseover更改对象组的背景色
我对WPF+C真的很陌生,并试图在msdn和stack上学习很多教程。我目前正在尝试更改ismouseover上下面(房屋图纸)所有对象(同时)的颜色。我可以一次使用一个对象(下面代码中的触发器)来实现这一点,但我无法找到同时更改所有颜色的方法,这是我的xaml代码,我没有向xaml.cs添加任何内容。我想我需要创建一些for循环,但我不知道如何将xaml中绘制的对象链接到xaml.cs中的代码C# 使用ismouseover更改对象组的背景色,c#,wpf,xaml,C#,Wpf,Xaml,我对WPF+C真的很陌生,并试图在msdn和stack上学习很多教程。我目前正在尝试更改ismouseover上下面(房屋图纸)所有对象(同时)的颜色。我可以一次使用一个对象(下面代码中的触发器)来实现这一点,但我无法找到同时更改所有颜色的方法,这是我的xaml代码,我没有向xaml.cs添加任何内容。我想我需要创建一些for循环,但我不知道如何将xaml中绘制的对象链接到xaml.cs中的代码 <Window x:Class="LAB2.MainWindow" xmlns="ht
<Window x:Class="LAB2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="400" Width="600">
<Canvas>
<Rectangle Canvas.Left="86" Canvas.Top="190" Height="171" Name="body" Stroke="Black" Width="387"/>
<Rectangle Canvas.Left="118" Canvas.Top="229" Height="82" Name="window" Stroke="Black" Width="89"/>
<Rectangle Canvas.Left="346" Canvas.Top="229" Height="132" Name="door" Stroke="Black" Width="83"/>
<Polygon Points="10,110 230,10 500,110" Fill="Blue" Stroke="Black" Name="triangle" Canvas.Left="35" Canvas.Top="86" />
<Rectangle Canvas.Left="156" Canvas.Top="109" Height="61" Name="chimney" Stroke="Black" Width="36">
<Rectangle.Style>
<Style TargetType="{x:Type Rectangle}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Fill" Value="Red" />
</Trigger>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="Fill" Value="Blue" />
</Trigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>
</Canvas>
<Window.Resources>
</Window.Resources>
您可以删除样式触发器,并将方法附加到.xaml.cs文件中的
MouseEnter
和MouseLeave
事件:
private void body_MouseEnter(object sender, MouseEventArgs e)
{
foreach(var c in canvas.Children)
{
if(c is Shape) (c as Shape).Fill = Brushes.Red;
}
}
private void body_MouseLeave(object sender, MouseEventArgs e)
{
foreach (var c in canvas.Children)
{
if (c is Shape) (c as Shape).Fill = Brushes.Blue;
}
}
这似乎是蛮力方法,但它是有效的 您可以删除样式触发器,并将方法附加到.xaml.cs文件中的
MouseEnter
和MouseLeave
事件:
private void body_MouseEnter(object sender, MouseEventArgs e)
{
foreach(var c in canvas.Children)
{
if(c is Shape) (c as Shape).Fill = Brushes.Red;
}
}
private void body_MouseLeave(object sender, MouseEventArgs e)
{
foreach (var c in canvas.Children)
{
if (c is Shape) (c as Shape).Fill = Brushes.Blue;
}
}
这似乎是蛮力方法,但它是有效的 您需要将触发器移到更高的位置。。。而且因为您只能在ControlTemplate或样式中使用触发器,所以我的解决方案有点棘手
<Control>
<Control.Template>
<ControlTemplate>
<Canvas>
<Rectangle Canvas.Left="86" Canvas.Top="190" Height="171" Fill="Blue" Name="body" Stroke="Black" Width="387"/>
<Rectangle Canvas.Left="118" Canvas.Top="229" Height="82" Fill="Blue" Name="window" Stroke="Black" Width="89"/>
<Rectangle Canvas.Left="346" Canvas.Top="229" Fill="Blue" Height="132" Name="door" Stroke="Black" Width="83"/>
<Polygon Points="10,110 230,10 500,110" Fill="Blue" Stroke="Black" Name="triangle" Canvas.Left="35" Canvas.Top="86" />
<Rectangle Canvas.Left="156" Canvas.Top="109" Height="61" Fill="Blue" Name="chimney" Stroke="Black" Width="36">
</Rectangle>
</Canvas>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="body" Property="Fill" Value="Red" />
<Setter TargetName="window" Property="Fill" Value="Red" />
<Setter TargetName="door" Property="Fill" Value="Red" />
<Setter TargetName="triangle" Property="Fill" Value="Red" />
</Trigger>
<!--<Trigger Property="IsMouseOver" Value="False">
<Setter TargetName="body" Property="Fill" Value="Green" />
<Setter TargetName="window" Property="Fill" Value="Green" />
<Setter TargetName="door" Property="Fill" Value="Green" />
<Setter TargetName="triangle" Property="Fill" Value="Green" />
</Trigger>-->
</ControlTemplate.Triggers>
</ControlTemplate>
</Control.Template>
</Control>
当您不在画布中设置背景属性时,您会得到更好的行为,因为画布将忽略IsMouseOver,只有当您将光标移动到画布中的一个对象上时,触发器才会工作。您需要将触发器移到更高的位置。。。而且因为您只能在ControlTemplate或样式中使用触发器,所以我的解决方案有点棘手
<Control>
<Control.Template>
<ControlTemplate>
<Canvas>
<Rectangle Canvas.Left="86" Canvas.Top="190" Height="171" Fill="Blue" Name="body" Stroke="Black" Width="387"/>
<Rectangle Canvas.Left="118" Canvas.Top="229" Height="82" Fill="Blue" Name="window" Stroke="Black" Width="89"/>
<Rectangle Canvas.Left="346" Canvas.Top="229" Fill="Blue" Height="132" Name="door" Stroke="Black" Width="83"/>
<Polygon Points="10,110 230,10 500,110" Fill="Blue" Stroke="Black" Name="triangle" Canvas.Left="35" Canvas.Top="86" />
<Rectangle Canvas.Left="156" Canvas.Top="109" Height="61" Fill="Blue" Name="chimney" Stroke="Black" Width="36">
</Rectangle>
</Canvas>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="body" Property="Fill" Value="Red" />
<Setter TargetName="window" Property="Fill" Value="Red" />
<Setter TargetName="door" Property="Fill" Value="Red" />
<Setter TargetName="triangle" Property="Fill" Value="Red" />
</Trigger>
<!--<Trigger Property="IsMouseOver" Value="False">
<Setter TargetName="body" Property="Fill" Value="Green" />
<Setter TargetName="window" Property="Fill" Value="Green" />
<Setter TargetName="door" Property="Fill" Value="Green" />
<Setter TargetName="triangle" Property="Fill" Value="Green" />
</Trigger>-->
</ControlTemplate.Triggers>
</ControlTemplate>
</Control.Template>
</Control>
当您不在画布中设置背景属性时,您会获得更好的行为,因为画布将忽略IsMouseOver,只有当您将光标移动到画布中的一个对象上时触发器才会工作。此外,您可以为形状定义基本样式,然后为多边形和矩形派生它
<Window.Resources>
<Style x:Key="ShapeMouseOverStyle" TargetType="{x:Type Shape}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Fill" Value="Red" />
</Trigger>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="Fill" Value="Blue" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type Rectangle}" BasedOn="{StaticResource ShapeMouseOverStyle}"/>
<Style TargetType="{x:Type Polygon}" BasedOn="{StaticResource ShapeMouseOverStyle}"/>
</Window.Resources>
<Grid>
<Canvas>
<Rectangle Canvas.Left="86" Canvas.Top="190" Height="171" Name="body" Stroke="Black" Width="387"/>
<Rectangle Canvas.Left="118" Canvas.Top="229" Height="82" Name="window" Stroke="Black" Width="89"/>
<Rectangle Canvas.Left="346" Canvas.Top="229" Height="132" Name="door" Stroke="Black" Width="83"/>
<Polygon Points="10,110 230,10 500,110" Fill="Blue" Stroke="Black" Name="triangle" Canvas.Left="35" Canvas.Top="86" />
<Rectangle Canvas.Left="156" Canvas.Top="109" Height="61" Name="chimney" Stroke="Black" Width="36"/>
</Canvas>
</Grid>
干杯…另外,您可以为形状定义基础样式,然后为多边形和矩形派生它
<Window.Resources>
<Style x:Key="ShapeMouseOverStyle" TargetType="{x:Type Shape}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Fill" Value="Red" />
</Trigger>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="Fill" Value="Blue" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type Rectangle}" BasedOn="{StaticResource ShapeMouseOverStyle}"/>
<Style TargetType="{x:Type Polygon}" BasedOn="{StaticResource ShapeMouseOverStyle}"/>
</Window.Resources>
<Grid>
<Canvas>
<Rectangle Canvas.Left="86" Canvas.Top="190" Height="171" Name="body" Stroke="Black" Width="387"/>
<Rectangle Canvas.Left="118" Canvas.Top="229" Height="82" Name="window" Stroke="Black" Width="89"/>
<Rectangle Canvas.Left="346" Canvas.Top="229" Height="132" Name="door" Stroke="Black" Width="83"/>
<Polygon Points="10,110 230,10 500,110" Fill="Blue" Stroke="Black" Name="triangle" Canvas.Left="35" Canvas.Top="86" />
<Rectangle Canvas.Left="156" Canvas.Top="109" Height="61" Name="chimney" Stroke="Black" Width="36"/>
</Canvas>
</Grid>
干杯…这个相关的问题可能有用:这个相关的问题可能有用:谢谢,我会尝试这个解决方案,它确实有点强,但我认为它应该工作得很好。谢谢,我会尝试这个解决方案,它确实有点强,但我认为它应该工作得很好。