2012-11-21 17 views
0

我對WPF + C#真的很陌生,並試圖趕上msdn和這裏的大量教程。我目前正試圖在ismouseover以下(在同一時間)更改所有對象的顏色(房屋圖紙)。我可以用一個對象(下面的代碼中的觸發器)做到這一點,但不能找出某種方式來同時更改所有顏色,這裏是我的xaml代碼,我沒有添加任何東西到xaml.cs我想我需要創建一些用於循環,但我不明白如何在xaml.cs用ismouseover改變對象組的背景顏色

<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中繪製的對象鏈接到代碼

+0

此相關的問題可能是有用的:http://stackoverflow.com/questions/1465806/applying-wpf-styles-to-child-items – WildCrustacean

回答

2

您需要將觸發器移動得更高......並且因爲您只能在ControlTemplate或Style中使用觸發器,所以我的解決方案有點棘手。

<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和觸發才起作用,當您在畫布上移動光標移到對象之一

1

你可以刪除你的風格的觸發器,並連接方法的MouseEnterMouseLeave事件在.xaml.cs文件:

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; 
     } 
    } 

這看起來像蠻力的方法,但它的工作原理。

+0

謝謝,我會努力這個解決方案,它確實有點強大,但我認爲它應該可以正常工作。 – EmilDo

0

另外,還可以爲Shape定義基礎樣式,然後爲Polygon和矩形派生它。

<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> 

乾杯......