WPF触发器无法正常工作,我做错了什么?

时间:2011-10-09 07:59:25

标签: c# .net wpf triggers wpf-controls

我有以下代码(仅相关的代码段)

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

当我运行应用程序时,它会挂起并弹出调试器。我做错了什么?

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

修改

我尝试创建一个按钮,只有触发器的标记会导致Unhandled Exception错误。

<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

使用数据触发器会使Unhandled Exception消失,但触发器没有响应:

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

UIElement.IsVisible不是一个可变属性。你必须设置UIElement.Visibility,这是一个枚举。

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

修改

正如Mackho所指出的,你不能在Style下使用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:Name添加到切换按钮;假设你称之为“MyToggleButton”

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

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