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>