C# WPF触发器不工作,我做错了什么?

C# WPF触发器不工作,我做错了什么?,c#,.net,wpf,triggers,wpf-controls,C#,.net,Wpf,Triggers,Wpf Controls,我有以下代码(仅相关片段) 当我运行应用程序时,它会挂断,并弹出te调试器。我做错了什么 我尝试过在网格上设置触发器,将所有内容包装在一个控件模板中,然后在那里设置触发器,同样的问题 编辑 我尝试创建一个按钮,但只有触发器的标记导致未处理的异常错误 <Button Content="Button" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="12,27,0,0" Name="TestButton" Vertic

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


当我运行应用程序时,它会挂断,并弹出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>

*小组2*

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

出现异常的原因是FrameworkElement.Triggers仅接受EventTrigger。这意味着,如果执行UIElement.Triggers(Button.Triggers或ribbon:ribbontoglebutton.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;
    }
}
在根控件的资源中的某个地方,添加BooltVisibilityConverter

将x:名称添加到切换按钮;假设你称之为“MyToggleButton”



对SPanel2执行类似的操作。

您需要使用DataTrigger,并将两个面板的style属性设置为复选框的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>


Debugger会弹出提示什么?它说发生了未经处理的Microsoft.NET异常运气不好,即使我完全删除setter标记,它也不起作用。如果在样式中声明触发器,则不能使用TargetName引用element@Mackho你完全正确。这就是在原地编码时发生的情况。正在编辑我的回复。不要担心;)我发布了一个解决方案,我想避免使用代码隐藏,看起来这是现在唯一的方法!您的解决方案消除了错误,但触发器没有响应。参见编辑2我已经测试了我发布的代码,它确实有效,我想你可能会错过一些东西,你能发布所有相关的代码吗?尽量不要声明stackpanel元素的可见性属性完成了,仍然没有响应。不可能!我刚刚测试了您的代码,删除了stackpanel中的Visibility=“Hidden”它可以正常工作。。。
<StackPanel x:Name="SPanel1" ...
            Visibility="{Binding IsChecked, ElementName=MyToggleButton, Converter={StaticResource BoolToVisibilityConverter}}" />
        <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>