【问题标题】:WPF Trigger not working, what am i doing wrong?WPF触发器不起作用,我做错了什么?
【发布时间】:2011-10-09 07:59:24
【问题描述】:

我有以下代码(仅相关的sn-ps)

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

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

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

编辑

我试过创建一个按钮,只有trigger的标签会导致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

使用数据触发器会使未处理的异常消失,但触发器没有响应:

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

【问题讨论】:

  • 说什么会弹出调试器?
  • 它说发生了未处理的 Microsoft .NET 异常

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


【解决方案1】:

您需要使用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>

【讨论】:

  • 您的解决方案消除了错误,但触发器没有响应。见编辑 2
  • 我已经对自己发布的代码进行了测试,它确实有效,我想您可能会遗漏一些东西,请您发布所有相关的代码部分吗?
  • 尽量不声明stackpanel元素的可见性属性
  • 完成了,还是没有反应。
  • 不可能!我刚刚测试了你的代码,在它工作的堆栈面板中删除 Visibility="Hidden"...
【解决方案2】:

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 做一些非常相似的事情。

【讨论】:

  • 不走运,即使我完全删除了setter标签也不起作用。
  • 如果在样式元素中声明触发器,则不能使用 TargetName 引用
  • @Mackho 你是绝对正确的。这就是您在适当位置编码时发生的情况。立即编辑我的回复。
  • 别担心 ;) 我发布了解决方案
  • 我想避免使用后面的代码,现在看来这是唯一的方法了!
猜你喜欢
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2013-05-16
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多