2011-10-09 86 views
1

我有下面的代码(只有相关的片段)WPF触发器不工作,我做错了什么?

<ribbon:RibbonWindow .............> 
    <Grid> 
     <ribbon:Ribbon> 
      <ribbon:RibbonToggleButton 
        x:Name="Button2" 
        SmallImageSource="Images\SmallIcon.png" 
        Label="Properties"> 
        <ribbon:RibbonToggleButton.Triggers> 
         <Trigger Property="ToggleButton.IsChecked" Value="True"> 
          <Setter TargetName="SPanel1" Property="UIElement.IsVisible" Value="False"/> 
          <Setter TargetName="SPanel2" Property="UIElement.IsVisible" Value="True"/> 

         </Trigger> 
        </ribbon:RibbonToggleButton.Triggers> 

      </ribbon:RibbonToggleButton> 


     </ribbon:Ribbon> 
    </Grid> 

</ribbon:RibbonWindow> 

当我运行应用程序,它挂断和TE调试器弹出。我究竟做错了什么?

我已经尝试在网格上设置触发器,将所有内容都包裹在控件模板中,并在那里设置触发器,同样的问题!

编辑

我试图创造一个按钮,只触发的代码会导致未处理的异常错误。

<Button Content="Button" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="12,27,0,0" Name="TestButton" VerticalAlignment="Top" Width="75" > 
     <Button.Triggers> 
      <Trigger></Trigger> 
     </Button.Triggers> 
</Button> 

编辑2

使用数据触发使未处理的异常消失,但触发不响应:

<StackPanel.Style> 
       <Style TargetType="StackPanel"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ElementName=Button2, Path=ToggleButton.IsChecked}" Value="True"> 
          <Setter Property="UIElement.Visibility" Value="Hidden"></Setter> 
         </DataTrigger> 

        </Style.Triggers> 
       </Style> 
      </StackPanel.Style> 

编辑3

<ribbon:RibbonToggleButton 
       x:Name="Button2" 
       SmallImageSource="Images\SmallIcon.png" 
       Label="Properties"> 

</ribbon:RibbonToggleButton> 

而且该面板被隐藏

<StackPanel     
     Grid.Row="2"     
     Grid.Column="1"      
     x:Name="SPanel1" 
     Visibility="Visible">       
     <Label>*Deafult Grid*</Label> 
<StackPanel.Style>       
    <Style TargetType="StackPanel">        
      <Style.Triggers>         
       <DataTrigger Binding="{Binding ElementName=Button2, Path=ToggleButton.IsChecked}" Value="True">          
       <Setter Property="UIElement.Visibility" Value="Hidden"></Setter>                 
       </DataTrigger>         
      </Style.Triggers>        
    </Style> 
       </StackPanel.Style> 
</StackPanel> 

而对于第二个StackPanel中,我想展示

<StackPanel 
    Grid.Row="2" 
    Grid.Column="1" 
    x:Name="SPanel2" 
    Visibility="Hidden"> 
     <Label>*Panel 2 *</Label> 
     <StackPanel.Style> 
      <Style TargetType="StackPanel"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=Button2, Path=IsChecked}" Value="True"> 
        <Setter Property="UIElement.Visibility" Value="Visible"></Setter> 
        </DataTrigger> 

       </Style.Triggers> 
      </Style> 
     </StackPanel.Style> 
</StackPanel> 
+0

调试说什么弹出? – Tigran

+0

它说未处理的Microsoft .NET异常发生 – SpeedBirdNine

回答

2

您需要使用DataTrigger,并设置两个面板的样式属性的复选框的属性格式器isChecked,这里的例子

 <CheckBox Name="check" Content="Prova" IsChecked="True"> </CheckBox> 

     <Canvas Name="SPanel1" Background="Blue" Width="100" Height="100"> 
      <Canvas.Style> 
       <Style TargetType="Canvas"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ElementName=check, Path=IsChecked}" Value="True"> 
          <Setter Property="Visibility" Value="Hidden"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Canvas.Style> 
     </Canvas> 
+0

您的解决方案摆脱了错误,但触发器没有响应。请参阅编辑2 – SpeedBirdNine

+0

我已经测试了自己的代码,我发布了它的确可行,我猜你可能会错过一些东西,请你发布有关代码的所有部分? – MaRuf

+0

完成!请参阅编辑3 – SpeedBirdNine

1

UIElement.IsVisible不是一个可变的特性。你将不得不设置UIElement.Visibility,这是一个枚举。

你得到一个异常的原因是因为FrameworkElement.Triggers只接受EventTrigger。这意味着如果你做UIElement.Triggers(Button.Triggers或ribbon:RibbonToggleButton.Triggers),你只能在其下添加EventTriggers。 Style,DataTemplate和ControlTemplate接受所有的TriggerBase派生类。

编辑

由于Mackho指出,你不能使用的TargetName下样式。您必须使用数据绑定来完成此操作。

假设SPanel1是一个StackPanel,这里是你可以做什么:

创建一个转换器

根控制的资源
public class BoolToVisibilityConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     return (bool)value ? Visibility.Visible : Visibility.Collapsed; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 

某处,加上BoolToVisibilityConverter

添加X:命名您的切换按钮;可以说你称之为“MyToggleButton”

<StackPanel x:Name="SPanel1" ... 
      Visibility="{Binding IsChecked, ElementName=MyToggleButton, Converter={StaticResource BoolToVisibilityConverter}}" /> 

并且为SPanel2做一些非常相似的事情。

+0

没有运气,即使我完全删除了setter标记,它也不起作用。 – SpeedBirdNine

+0

参阅编辑。更多信息 – SpeedBirdNine

+1

我编辑了我的回复 –