管理视觉状态和控件视觉状态之间转换的逻辑。还为VisualStateManager.VisualStateGroups提供附加属性支持,这是您在XAML中为控件模板定义可视状态的方法。
使用 VisualStateManager 在数据模板中实现 WPF 动画
当您尝试为某些数据模板输入 VisualStates 时,这是非常常见的问题。 下面的代码工作正常,但前提是我使用 FrameworkElement,例如自定义 UserControl: 当您尝试输入 VisualStates 来表示某些 DataTemplate 时,这是很常见的问题。 下面的代码工作正常,但前提是我使用 FrameworkElement,例如自定义 UserControl: <UserControl> <!-- Namespaces go here --> <Grid x:Name="rootgrid"> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="States"> <Storyboard x:Key="Focused"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> <EasingColorKeyFrame KeyTime="0:0:0.1" Value="#FFE90B0B"/> </ColorAnimationUsingKeyFrames> </Storyboard> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <Ellipse x:Name="ellipse" Width="26" Height="26" Fill="Yellow" SnapsToDevicePixels="True" Stretch="Fill" Stroke="Black" StrokeThickness="2"> <Ellipse.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform/> <TranslateTransform/> </TransformGroup> </Ellipse.RenderTransform> </Ellipse> </Grid> </UserControl> 但是当我尝试将代码粘贴到DataTemplate中时: <DataTemplate x:Key="MyDataTemplate"> <Grid x:Name="rootgrid"> ... Code the same as above... </Grid> </DataTemplate> 然后我将“MyDataTemplate”应用到我的自定义元素(类,它实现 ContentTemplate 依赖属性),在这种情况下我无法使用动画状态“Focused”。 即使我通过 VisualTree 获得一个名为“rootgrid”的网格对象并使用它: VisualStateManager.GoToState(rootgrid, "Focused", true); 什么也没发生...:( 问题是如何将 VisualStates 中实现的 DataTemplate(动画)用于非 FrameworkElement 对象? 对于OP来说,答案可能为时已晚,但对于其他遇到这个问题的人来说: 可以在 VisualStateManager 中使用 DataTemplate。关键是使用包含 VisualStateManager.GoToElementState 的 VisualStateManager.GoToState 来调用 FrameworkElement 而不是 VisualStateManager。 顺便说一句,上面的 XAML 没有正确指定 Focused 的 VisualState,应该更改为: <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="States"> <VisualState Name="Focused"> <StoryBoard> 等等
.Net Maui Switch 视觉状态管理器不会将 OnColor 更改为 Off 状态
只需在 Android 上实现一个黑色背景显示的切换。 添加了一个开关,设法为开启状态设置 OnColor 和 ThumbColor,为关闭状态设置 Thumbcolor,但无论我是
代码创建的DataTemplate中的VisualStateManager
我有以下代码: 主页.xml 我有以下代码: 主页.xml <ContentPage x:Class="Test1.MainPage" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" Title="MainPage"> <ContentPage.Resources> <DataTemplate x:Key="DefaultItemTemplate"> <Border Stroke="Transparent" BackgroundColor="WhiteSmoke" StrokeShape="RoundRectangle 4" MinimumWidthRequest="36" MinimumHeightRequest="36"> <VisualStateManager.VisualStateGroups> <VisualStateGroup Name="CommonStates"> <VisualState Name="Normal" /> <VisualState Name="Selected"> <VisualState.Setters> <Setter Property="BackgroundColor" Value="{StaticResource Primary}" /> <Setter TargetName="Index" Property="Label.TextColor" Value="White" /> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <Label x:Name="Index" Text="X" TextColor="Black" HorizontalOptions="Center" VerticalOptions="Center" /> </Border> </DataTemplate> </ContentPage.Resources> <StackLayout Padding="16" Spacing="12"> <StackLayout Orientation="Horizontal"> <Label Text="1"/> <CheckBox x:Name="Check1" CheckedChanged="Check1_CheckedChanged"/> <ContentView x:Name="ContentView1"/> </StackLayout> <StackLayout Orientation="Horizontal"> <Label Text="2"/> <CheckBox x:Name="Check2" CheckedChanged="Check2_CheckedChanged"/> <ContentView x:Name="ContentView2"/> </StackLayout> </StackLayout> </ContentPage> MainPage.xaml.cs using Microsoft.Maui.Controls.Shapes; namespace Test1; public partial class MainPage : ContentPage { View view1; View view2; public MainPage() { InitializeComponent(); //Taked from xaml resource view1 = (View)((DataTemplate)Resources["DefaultItemTemplate"]).CreateContent(); ContentView1.Content = view1; //Created by code view2 = (View)DefaultItemTemplate.CreateContent(); ContentView2.Content = view2; } private void Check1_CheckedChanged(object sender, CheckedChangedEventArgs e) { try { VisualStateManager.GoToState(view1, e.Value ? "Selected" : "Normal"); var asd = view1.FindByName("Index"); System.Diagnostics.Debug.WriteLine(asd ?? "null"); // works ok, it gets the label } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"Error: {ex}"); } } private void Check2_CheckedChanged(object sender, CheckedChangedEventArgs e) { try { VisualStateManager.GoToState(view2, e.Value ? "Selected" : "Normal"); var asd = view2.FindByName("Index"); System.Diagnostics.Debug.WriteLine(asd ?? "null"); // returns null, label not found?? } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"Error: {ex}"); } } private static DataTemplate DefaultItemTemplate => new DataTemplate( () => { var view = new Border() { Stroke = Colors.Transparent, BackgroundColor = Colors.WhiteSmoke, StrokeShape = new RoundRectangle { CornerRadius = 4 }, MinimumWidthRequest = 36, MinimumHeightRequest = 36, }; var label = new Label() { StyleId = "Index", // it doenst work Text = "X", TextColor = Colors.Black, HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center }; view.Content = label; var commonStateGoup = new VisualStateGroup { Name = "CommonStates" }; var stateNormal = new VisualState { Name = "Normal" }; var stateSelected = new VisualState { Name = "Selected" }; stateSelected.Setters.Add(new Setter { Property = BackgroundColorProperty, Value = Application.Current!.Resources.TryGetValue("Primary",out var primaryColor) ? (Color)primaryColor : Colors.BlueViolet, }); // Commenting this works, but label is not affected. Else /* stateSelected.Setters.Add(new Setter { TargetName = "Index", // doesnt work Property = Label.TextColorProperty, Value = Colors.White, }); */ commonStateGoup.States.Add(stateNormal); commonStateGoup.States.Add(stateSelected); VisualStateManager.GetVisualStateGroups(view).Add(commonStateGoup); return view; }); } 我想要实现的是从 xaml 资源创建 DefaultItemTemplate,但通过代码,目前我无法使 VisualStateManager 定位标签。如果我从 xaml 页面资源中获取模板,而不是从后面的代码中获取模板,它会按预期工作。 我怎样才能让它发挥作用? 感谢Liqun Shen-MSFT在评论中发布的链接,我可以让它工作。这是DataTemplate代码: private static DataTemplate DefaultItemTemplate => new( () => { var view = new Border() { Stroke = Colors.Transparent, StrokeThickness = 4d, BackgroundColor = Colors.WhiteSmoke, StrokeShape = new RoundRectangle { CornerRadius = 4 }, MinimumWidthRequest = 36, MinimumHeightRequest = 36, }; var label = new Label() { Text = "-", TextColor = Colors.Black, FontSize = 14, HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center }; view.Content = label; // using Microsoft.Maui.Controls.Internals; // this make the magic, you need to set the namescope and register the name this way INameScope nameScope = new NameScope(); NameScope.SetNameScope(view, nameScope); //nameScope.RegisterName("Root", view); nameScope.RegisterName("Index", label); var commonStateGoup = new VisualStateGroup { Name = "CommonStates" }; var stateNormal = new VisualState { Name = "Normal" }; var stateSelected = new VisualState { Name = "Selected" }; stateNormal.Setters.Add(new()); stateSelected.Setters.Add(new Setter { //TargetName = "Root", Property = BackgroundColorProperty, Value = Application.Current!.Resources.TryGetValue("Primary",out var primaryColor) ? (Color)primaryColor : Colors.BlueViolet, }); stateSelected.Setters.Add(new Setter { TargetName = "Index", Property = Label.TextColorProperty, Value = Colors.White, }); commonStateGoup.States.Add(stateNormal); commonStateGoup.States.Add(stateSelected); VisualStateManager.GetVisualStateGroups(view).Add(commonStateGoup); return view; });
如何在.Net MAUI中根据控件状态改变ContentPresenter的文本颜色
我的问题是这个问题的扩展,我想根据单选按钮的状态更改文本颜色。如果选中,我希望它是白色的,如果未选中,我希望它是黑色的。 细节: 我正在使用 c...
大家好,我有一个场景,我想切换 4 个不同内容控件的可见性。我设置了不透明度的视觉状态,并根据每个给定的状态折叠(参见代码。)我想要什么
VisualStateManager.GoToState 方法调用不改变状态并显示弹出窗口
我有一个由 ControlTemplate 定义的控件,如下所示: <
我在 App.xaml 中合并的新文件中设置了样式。在视图中,Intellisense 向我显示了我想要使用的样式的 x:Key,但自适应触发器不会触发。我用 st 测试了它...
StrokeDashArray不能与VisualStateManager(UWP)一起工作。
如果Textbox处于禁用状态,我想让它有一个虚线,我的代码是这样的。
骑士Xamarin xaml。VisualStateManager中的 "字段Normal已经被声明"。
我使用Xamarin Forms 4.5.0.617,想使用VisualStateManager(https:/docs.microsoft.comen-usxamarinxamarin-formsuser-interfacevisual-state-manager)来改变样式,如果一个元素是 ...
我正在尝试使用普通的xamarin表单制作类似于视图的选项卡,因为我不想使用任何第三方插件。为此,我使用了以下两个框架,并将其状态更改为“已选择”和“ ...
如何通过Behavior和VisualStateManager将TextBox设置为特定的内置VisualState
我正在尝试使用验证来显示Windows元素(实际上是文本框)上的验证错误,但是当...
VisualStateManager.GoToState不适用于TextBox(UWP)
我正在尝试通过代码设置TextBox的VisualState。
使用VisualStateManager根据不同状态(UWP)更改文本框的边框颜色
我想根据不同的状态(正常,MouseOver,禁用等)更改文本框的边框颜色。我的代码看起来像这样 ... [] ] >>
Navigator上的Flutter Provider注入多个对象
Flutter的新手,我的应用程序顶部有Event类的Provider。有没有办法在Navigator构建器中注入多个对象,例如MapBox(events.itmaps,events.maps)?类...
我正在尝试使用Visual State Manager在自定义控件上设置自定义属性,但到目前为止我还没有运气。我的自定义控件只是带有附加可绑定属性的标签。...
[UWP] [VisualState]自定义ListViewItem悬停演示文稿
我想将悬停动作添加到ListViewItem,但似乎在ListViewItem.DataTemplate中,不会触发“ PointerOver”状态。我正在创建一个自定义ItemContainerStyle,但在此过程中...
为什么我们没有UWP这样容易响应的助手?我在单独的.xaml文件中具有以下样式:
使用StaticResource作为VisualTransition的情节提要时出错
我在一个VisualStateGroup内部有一个VisualTransition,用于Button控件。故事板属性绑定到StaticResource故事板:
我想向WPF按钮添加新的“已激活”状态,并且我希望避免从头开始重新创建控件。此新状态链接到IsActivated依赖项属性,并且必须更改...
我正在尝试在UWP中创建一个AppBarButton,当它变得可见时淡入淡出。为此,我复制了AppBarButton样式并添加了另一个带有来自...的触发器的VisualStateGroup。