我想知道触发器和visualStateManager之间的区别.我正在模仿ComboBox并在官方MSDN网站(http://msdn.microsoft.com/en-us/library/ms752094.aspx)上使用VisualStateManager来更改所选组合框的颜色.但你可以用触发器做同样的事情.
是不是有些差异?例如,VisualStateManager将"更快"或我不知道.我想知道什么是更好用.
我是模仿的菜鸟,我不太了解它,所以我现在可以使用的是触发器(我理解),但VisualStateManager和一些故事板现在对我来说是很大的未知.
任何人都可以向我解释如何让可视状态管理器使用WPF应用程序吗?它刚被添加到新的wpftoolkit中.我按照说明安装了它,但即使样本也没有显示VSM.在Silverlight中,它可以工作,但不能在WPF中工作.如果安装了最新的Blend 2并使用SP1进行了更新.
是否可以在代码中以编程方式将新添加VisualState到CustomControl TemplateVisualStateManager?
例如,我可以在设计时手动将此 XAML 添加到 CustomControl 模板:
<VisualState x:Name="First">
<Storyboard>
<ColorAnimation Duration="0:0:0"
Storyboard.TargetName="SBorder"
Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" To="Red" />
</Storyboard>
</VisualState>
Run Code Online (Sandbox Code Playgroud)
但是我怎么能VisualState在运行时添加一个新的呢?
我有一个故事板,想要设置附加属性 VisualStateUtility.InitialState。我尝试过各种组合,但属性从未得到解决。
我收到以下错误:无法解析 TargetProperty (VisualStateUtility.InitialState)
如何在 Storyboard 上设置自定义附加属性的值?
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="(Fully.Qualified.Namespace.VisualStateUtility.InitialState)" Storyboard.TargetName="ExpanderButton">
Run Code Online (Sandbox Code Playgroud)
public static string GetInitialState(DependencyObject obj)
{
return (string)obj.GetValue(InitialStateProperty);
}
public static void SetInitialState(DependencyObject obj, string value)
{
obj.SetValue(InitialStateProperty, value);
}
// Using a DependencyProperty as the backing store for InitialState. This enables animation, styling, binding, etc...
public static readonly DependencyProperty InitialStateProperty =
DependencyProperty.RegisterAttached("InitialState", typeof(string), typeof(VisualStateUtility), new PropertyMetadata(null,OnInitialStatePropertyChanged));
Run Code Online (Sandbox Code Playgroud) 我必须VisualStateManager在我的WPF窗口中使用类,但由于我已经引用了两者 的程序集WPF Toolkit并且PresentationFramework.dll在我的项目中,C#无法解析VisualStateManager类并且给出编译错误,如" 两种类型中存在的类型"PresentationFramework.dll '和'WPFToolkit.dll' "我无法继续.
如何告诉C#编译器使用任何一个程序集中的VisualStateManager类并让项目成功编译?
我经常发现需要包括"离开"和"现在"类型的视觉状态,这些视觉状态用于根据某些其他条件使控件动画离开或可见.
然后,"离开"状态通常是应该是初始状态的状态.根据我的理解,没有办法在SL中定义初始状态,而是"base",这根本不是一个状态,而是表示状态管理器尚未激活的状态(没有状态故事板运行到改变控件的外观).
当然你可以设计"base"看起来像"离开",但这意味着Expression Blend中的默认外观是不可见的(你不能永久地"固定"状态).
要改变我尝试的初始状态
所以问题似乎是无论视觉状态管理器做了什么,它都不会立即执行,但需要一个明显的瞬间改变外观.
(当然,为引导程序直接设置属性是另一种选择,但仅适用于UserControls:在模板化控件中,我必须引入另一个depprop模板绑定控件模板,这是我认为过度开始的地方.)
我想我已经涵盖了所有这一切,我只能忍受一个看不见的基础状态?
我用的是SL4.
我定义了以下视觉状态:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="EditStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:2"/>
</VisualStateGroup.Transitions>
<VisualState Name="Editing" />
<VisualState Name="Normal">
<Storyboard>
<ThicknessAnimation Storyboard.TargetName="ViewBorder" Storyboard.TargetProperty="Margin" To="0" Duration="0"/>
<DoubleAnimation Storyboard.TargetName="Header" Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(ScaleTransform.ScaleY)" To="0" Duration="0"/>
<ColorAnimation Storyboard.TargetName="EditBorder" Storyboard.TargetProperty="Background.Color" To="Red" Duration="0"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
Run Code Online (Sandbox Code Playgroud)
在DoubleAnimation和ColorAnimation做工精细,有VisualStateManager超过2秒对他们产生过渡动画.
但是,ThicknessAnimation没有动画.相反,它会在过渡期结束时捕捉到结束值.
有没有办法VisualStateManager为它生成转换,或者我将被迫提供手动转换?
在WPF中使用VisualStateManager时,可能需要在控件初始化时转换为VisualState。据我所知,没有办法在Xaml中声明初始状态,这给了您有限的选择权,可以在初始化后将代码转换为所需的状态。
在后面使用代码并非总是可取的,如果您使用绑定来控制VisualState,那么也不总是可能的。
所以问题是:如何在WPF中设置初始VisualState,而不在后面的代码中进行设置?
我试图实现DataTrigger,根据在视图中切换的切换按钮执行动态绑定.但在搜索问题之后,WinRT中的DataTrigger?看起来这在Windows Universal应用程序中不可用,而应该使用VisualStateManager.
我的问题是,如何使用VisualStateManager实现以下代码的等效代码?或者从视图模型后面的代码中的属性设置动态绑定的任何其他替代方法.
这是我打算使用的XAML,直到我遇到这个问题,其中默认绑定是OrdinaryGradePointKV,当切换按钮切换时,绑定更改为HigherGradePointKV:
<ComboBox
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="2"
Width="60"
HorizontalAlignment="Right"
DisplayMemberPath="Key">
<ComboBox.Style>
<Style>
<Setter Property="ComboBox.ItemsSource" Value="{Binding OrdinaryGradePointKV}"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsHigherToggled}" Value="True">
<Setter Property="ComboBox.ItemsSource"
Value="{Binding HigherGradePointKV}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
VM的精简版本如下所示,显示了绑定的属性:
namespace LC_Points.ViewModel
{
public class MainViewModel : ViewModelBase
{
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel()
{
//call methods to initialize list data
GetSubjectTypes();
GetOrdinaryGradePairs();
GetHigherGradePairs();
}
public List<Score> Subjects { get; set; …Run Code Online (Sandbox Code Playgroud) 我目前正在为我的应用程序开发一个自定义控件,该控件使用标题来扩展和折叠内容,您可以单击该标题来更改状态。此刻的模板看起来像这样。
<Style TargetType="controls:ExpandControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:ExpandControl">
<Border>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="State">
<VisualState x:Name="Visible">
<VisualState.Setters>
<Setter Target="Grid.Visibility" Value="Visible" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Collapsed">
<VisualState.Setters>
<Setter Target="Grid.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ContentPresenter x:Name="HeaderPresenter" Content="{TemplateBinding Header}" />
<Grid x:Name="Grid" Grid.Row="1">
<ContentPresenter x:Name="ContentPresenter" Content="{TemplateBinding Content}" />
</Grid>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
从模板中可以看到,我目前正在使用视觉状态来设置该控件中内容的可见性,但这并不是很好的用户体验,因为内容消失了。
我希望能够以某种方式操纵内容,以使控件的可见性更改时,内容看起来像是从标题中折叠和展开。
我已经看过使用情节提要的动画,但是我是一个全新的人,如果有人可以在情节提要上提供一些帮助以及如何使场景适合我的控件,将不胜感激!
提前致谢!
wpf ×6
c# ×4
silverlight ×3
animation ×2
xaml ×2
.net-4.0 ×1
binding ×1
c#-4.0 ×1
mvvm ×1
storyboard ×1
triggers ×1
uwp ×1
wpftoolkit ×1