C# UWP样式触发器丢失
UWP XAML似乎不支持样式中的触发器。实现以下触发器的常见解决方法是什么C# UWP样式触发器丢失,c#,xaml,visual-studio-2015,win-universal-app,uwp,C#,Xaml,Visual Studio 2015,Win Universal App,Uwp,UWP XAML似乎不支持样式中的触发器。实现以下触发器的常见解决方法是什么 <Style TargetType="Button"> <Style.Triggers> <Trigger Property="Visibility" Value="Collapsed"> <Setter Property="Text" Value="" /> </Trigger> <
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="Visibility" Value="Collapsed">
<Setter Property="Text" Value="" />
</Trigger>
</Style.Triggers>
</Style>
目前,我看到了在UWP中实现触发器的以下选项:
使用动画或可视化触发器。如果我不使用它们来调整屏幕上的控件,两者似乎都是错误的
我想我找到了实现控件触发器的正确方法。 请参见以下代码作为演示:
xmlns:Interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:Core="using:Microsoft.Xaml.Interactions.Core"
<Border x:Name="BackgroundElement" Tag="Text">
<Interactivity:Interaction.Behaviors>
<Core:DataTriggerBehavior Binding="{Binding Tag, ElementName=BackgroundElement}" Value="Text">
<Core:ChangePropertyAction PropertyName="BorderBrush" Value="AliceBlue" />
</Core:DataTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</Border>
xmlns:Interactivity=“使用:Microsoft.Xaml.Interactivity”
xmlns:Core=“使用:Microsoft.Xaml.Interactions.Core”
如果有一个没有ElementName的解决方案,那就太棒了。我本可以在WPF中使用AncestorType来实现这一点,但在UWP中也缺少这一点。无论如何,您似乎无法在样式中使用Core:DataTriggerBehavior
。在WinRT中,仅支持Self和TemplatedParent模式,FindAncestor不可用。因此,在使用时,需要使用ElementName
作为解决方法。如果在项目中使用DataContext或ViewModel,可以绑定到DataContext或ViewModel以避免使用ElementName
。例如:
<Page ...>
<Page.Resources>
<local:MyViewModel x:Key="ViewModel" />
</Page.Resources>
...
<Border x:Name="BackgroundElement" DataContext="{Binding Source={StaticResource ViewModel}}">
<Interactivity:Interaction.Behaviors>
<Core:DataTriggerBehavior Binding="{Binding Tag}" Value="Text">
<Core:ChangePropertyAction PropertyName="Background" Value="Red" />
</Core:DataTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</Border>
...
</Page>
在UWP应用程序中,您必须使用。请查看如何创建自定义StateTrigger(从StateTriggerBase继承),然后在可视状态中使用它
public class MyViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _tag;
public string Tag
{
get
{
return _tag;
}
set
{
_tag = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Tag"));
}
}
}
}