gpt4 book ai didi

wpf - 如何在共享资源中重用 VisualState、VisualStateGroup 和 VsualStateManager?

转载 作者:行者123 更新时间:2023-12-04 22:25:09 26 4
gpt4 key购买 nike

我创建了许多按钮,它们在我的 Windows Phone 项目中使用相同的 VisualStateManager、VisualStateGroup 和 VisualState。然后,我想将它们全部重用作为共享资源作为其他类型的元素,例如边距、颜色等。

但是我发现只有重用storyboard的方法,如果我能重用所有的VisualState就更好了。

是否有可重用的 VisualState 的解决方案?

最佳答案

我发现的解决方案是在 Windows 10 UWP 应用程序上测试的,我测试了几个选项,如反序列化 XAML、克隆等,但最后我发现以下是最佳解决方案:

1 - 将 VisualStateGroup 设置为资源

 <Application.Resources>
<DataTemplate x:Key="VisualStateTemplate">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup >
<VisualState x:Name="NarrowView" >
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="0" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="Text.(RelativePanel.Below)" Value="Image" />
<Setter Target="Content.(RelativePanel.Below)" Value="Text" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="WideView">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="860" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="Text.(RelativePanel.RightOf)" Value="Image" />
<Setter Target="Content.(RelativePanel.Below)" Value="Image" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</DataTemplate>
</Application.Resources>

这是第一个技巧,用这个你可以“加载” VisualStateGroup几次。

2 - 实现附加属性以设置为 VisualStateGroup 的控件
public class VisualStateExtensions : DependencyObject
{
public static void SetVisualStatefromTemplate(UIElement element, DataTemplate value)
{
element.SetValue(VisualStatefromTemplateProperty, value);
}

public static DataTemplate GetVisualStatefromTemplate(UIElement element)
{
return (DataTemplate) element.GetValue(VisualStatefromTemplateProperty);
}

public static readonly DependencyProperty VisualStatefromTemplateProperty = DependencyProperty.RegisterAttached("VisualStatefromTemplate", typeof(DataTemplate), typeof(VisualStateExtensions), new PropertyMetadata(null, VisualStatefromTemplateChanged));

private static void VisualStatefromTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is FrameworkElement frameworkElement)
{
var visualStateGroups = VisualStateManager.GetVisualStateGroups(frameworkElement);
if (visualStateGroups != null)
{
var template = (DataTemplate) e.NewValue;
var content = (FrameworkElement) template.LoadContent();
if (VisualStateManager.GetVisualStateGroups(content) is IList list)
{
var source = list.Cast<VisualStateGroup>().ToList();
var original = source.First();

source.RemoveAt(0);

visualStateGroups.Add(original);
}
}
}
}
}

这一步只是复制和粘贴,现在在您的控件中只需添加:

3 - 添加附加属性
<UserControl x:Class="Example.MyUserControl1"...>
<RelativePanel x:Name="Root" local:VisualStateExtensions.VisualStatefromTemplate="{StaticResource VisualStateTemplate}" >
</UserControl>

<UserControl x:Class="Example.MyUserControl2"...>
<RelativePanel x:Name="Root" local:VisualStateExtensions.VisualStatefromTemplate="{StaticResource VisualStateTemplate}" >
</UserControl>

有了这个,您可以在多个控件之间共享一个 VisualStateGroup,而无需重复代码。

关于wpf - 如何在共享资源中重用 VisualState、VisualStateGroup 和 VsualStateManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31912603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com