Ric*_*ire 25 .net wpf datatrigger
我创建了一个UserControl,类似于以下内容:
<UserControl>
<StackPanel Orientation="Vertical">
<StackPanel x:Name="Launch" Orientation="Horizontal" Visibility="Collapsed">
<!-- Children here -->
</StackPanel>
<ToggleButton x:Name="ToggleLaunch" IsChecked="False" Content="Launch" />
</StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
我一直在尝试使用DataTrigger使"启动"StackPanel在检查ToggleButton时变得可见,否则保持折叠状态.但是,在运行时我收到一条错误,指出"失败的对象初始化(ISupportInitialize.EndInit).触发器集合成员必须是EventTrigger类型".我已经尝试将它添加到UserControl和StackPanel的触发器集合中但没有成功.我的触发器XAML如下所示:
<DataTrigger Binding="{Binding ElementName=ToggleLaunch, Path=IsChecked}" Value="True">
<Setter TargetName="Launch" Property="UIElement.Visibility" Value="Visible" />
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)
Con*_*ngo 39
来自MSDN Docs,根据理查德·C·麦奎尔(Richard C. McGuire)的回答(略微转述):
DataTriggers可以与XML标签Style,ControlTemplate和DataTemplate一起使用
例如,如果您尝试向a添加触发器TextBlock,则会生成此错误:
错误:触发器集合成员必须是EventTrigger类型
为什么?A Trigger只能放在一个Style,ControlTemplate或者DataTemplate,我们正试图将它直接放在一个TextBlock.
在这种情况下,修复很容易:只需将触发器包裹在一个样式中,然后将此样式放在其中TextBlock,错误就会消失.
以下是修复之前生成错误的XAML :
<TextBlock x:Name="Hello" Text="{Binding Hello, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<TextBlock.Triggers>
<DataTrigger Binding="{Binding Hello}" Value="GoGreen">
<Setter Property="Foreground" Value="Green" />
</DataTrigger>
</TextBlock.Triggers>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
这是修复后的XAML :
<TextBlock x:Name="Hello" Text="{Binding Hello, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red" />
<Style.Triggers>
<DataTrigger Binding="{Binding Hello}" Value="GoGreen">
<Setter Property="Foreground" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
这是一个示例截图,显示如果我们输入GoGreen,文本变为绿色:

...如果我们输入其他内容,则文本默认为红色:

网上有很多关于WPF触发器的免费材料,所有这些材料在解释这个概念方面做得相当不错,而且这个页面让我失去了一分钱.
Ric*_*ire 14
管理好解决它.忘记了DataTriggers适用于MSDN Docs的 Style,ControlTemplate和DataTemplate .
解决方案是使用EventTrigger作为指示的错误消息.我的解决方案如下:
<EventTrigger RoutedEvent="ToggleButton.Checked">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility"
Storyboard.TargetName="LaunchButtons">
<DiscreteObjectKeyFrame KeyTime="0:0:0"
Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="ToggleButton.Unchecked">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility"
Storyboard.TargetName="LaunchButtons">
<DiscreteObjectKeyFrame KeyTime="0:0:0"
Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
Run Code Online (Sandbox Code Playgroud)
如果其他人有另一个解决方案,那么就不要将此标记为答案.
您还可以将堆栈面板中的 Visibility 绑定到 ToggleButton 中的 IsChecked 属性。您需要使用自定义 ValueConverter。这是我在网上找到的一个:
/// <summary>
/// WPF/Silverlight ValueConverter : Convert boolean to XAML Visibility
/// </summary>
[ValueConversion(typeof(bool), typeof(Visibility))]
public class VisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (value != null && (bool)value) ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
Visibility visibility = (Visibility)value;
return (visibility == Visibility.Visible);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
这可能已经过时了,但以下内容对我有用。它可能会帮助人们遇到以下问题:“触发器集合成员必须是 EventTrigger 类型”
<Control>
<Control.Template>
<ControlTemplate >
<!-- Design -->
<StackPanel>
<CheckBox Name="CollapseControl" Content="Show" IsChecked="False" />
<Label Name="CollapseTarget" Content="MyContent" Visibility="Collapsed" />
</StackPanel>
<!-- Triggers -->
<ControlTemplate.Triggers >
<Trigger SourceName="CollapseControl" Property="IsChecked" Value="True" >
<Setter TargetName="CollapseTarget" Property="Visibility" Value="Visible" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Control.Template>
</Control>
Run Code Online (Sandbox Code Playgroud)
将“您想要控制的内容”封装在 Control 对象内允许您使用 Control.Template 来使用您想要的任何触发器。这样,您就可以在 XAML 中直接使用(数据)触发器,而无需定义静态样式或全新的 UserControl。
| 归档时间: |
|
| 查看次数: |
23069 次 |
| 最近记录: |