WPF触发不工作,我做错了什么
本文关键字:错了 什么 工作 WPF | 更新日期: 2023-09-27 18:10:51
我有以下代码(只有相关的片段)
<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>
当我运行应用程序时,它挂起并弹出调试器。我做错了什么?
我试过在网格上设置触发器,在控制模板中包装所有内容并在那里设置触发器,同样的问题!
编辑
我已经尝试创建一个按钮,只有触发器的标签导致未处理的异常错误。
<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
使用Data触发器使未处理异常消失,但触发器没有响应:
<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>
您需要使用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>
元素。IsVisible不是一个可变属性。你需要设置UIElement。可见性,这是一个enum。
你得到一个异常的原因是因为FrameworkElement。触发器只接受EventTrigger。这意味着如果你做了UIElement。触发器(按钮。触发器或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做类似的操作