none
关于VisualStateGroup的提问 RRS feed

  • 问题

  • 我想实现VisualState中使用自定义的附加属性,并且已在社区中找到一个用法 附加属性的用法

    但是我发现链接中的用法有个问题,就是我自定义的附加属性必须是固定的似的,比如文中例子中附加属性为Width,如果我把Width改为WidthP,那么xaml设计器就会抛出未能找到组件的错误,然后VisualStateGroup_CurrentStateChanged事件也不会执行,如果是文中的Width属性,一切都正常,我就不是很明白了?难道定义的附加属性必须是固定的控件已知属性吗????求大神给予帮助解答,谢谢了!!!

    2015年12月30日 1:42

全部回复

  • 如果WidthP这个属性是不存在的,肯定会报错。

    自定义的属性是可以使用的。

    参考下面这个例子:这里就使用了自定义的属性

    /// <summary>
        /// Trigger for switching when the screen orientation changes
        /// </summary>
    	public class OrientationStateTrigger : StateTriggerBase
    	{
    		/// <summary>
    		/// Initializes a new instance of the <see cref="OrientationStateTrigger"/> class.
    		/// </summary>
    		public OrientationStateTrigger()
    		{
    			if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled)
    			{
    				//TODO: Make this a weak event reference!
    				DisplayInformation.GetForCurrentView().OrientationChanged +=
    					OrientationStateTrigger_OrientationChanged;
    			}
    		}
    
    		private void OrientationStateTrigger_OrientationChanged(DisplayInformation sender, object args)
    		{
                UpdateTrigger(sender.CurrentOrientation);
    		}
    
            private void UpdateTrigger(Windows.Graphics.Display.DisplayOrientations orientation)
            {
                if (orientation == Windows.Graphics.Display.DisplayOrientations.None)
                {
                    SetActive(false);
                }
                else if (orientation == Windows.Graphics.Display.DisplayOrientations.Landscape ||
                   orientation == Windows.Graphics.Display.DisplayOrientations.LandscapeFlipped)
                {
                    SetActive(Orientation == Orientations.Landscape);
                }
                else if (orientation == Windows.Graphics.Display.DisplayOrientations.Portrait ||
                        orientation == Windows.Graphics.Display.DisplayOrientations.PortraitFlipped)
                {
                    SetActive(Orientation == Orientations.Portrait);
                }
            }
    
    		/// <summary>
    		/// Gets or sets the orientation to trigger on.
    		/// </summary>
    		public Orientations Orientation
    		{
    			get { return (Orientations)GetValue(OrientationProperty); }
    			set { SetValue(OrientationProperty, value); }
    		}
    
    		/// <summary>
    		/// Identifies the <see cref="Orientation"/> parameter.
    		/// </summary>
    		public static readonly DependencyProperty OrientationProperty =
    			DependencyProperty.Register("Orientation", typeof(Orientations), typeof(OrientationStateTrigger), 
    			new PropertyMetadata(Orientations.None, OnOrientationPropertyChanged));
    
    		private static void OnOrientationPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    		{
    			var obj = (OrientationStateTrigger)d;
    			if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled)
    			{
    				var orientation = DisplayInformation.GetForCurrentView().CurrentOrientation;
    				obj.UpdateTrigger(orientation);
    			}
            }
    
    		/// <summary>
    		/// Orientations
    		/// </summary>
    		public enum Orientations 
    		{
    			/// <summary>
    			/// none
    			/// </summary>
    			None,
    			/// <summary>
    			/// landscape
    			/// </summary>
    			Landscape,
    			/// <summary>
    			/// portrait
    			/// </summary>
    			Portrait
    		}
    	}

    2015年12月30日 4:56
  • 感谢您的回答,但是我想说的是。

    第一,我的例子是附加属性。我知道依赖属性是可以得,因为我实现了。

    第二,我不是没定义,我是想把那个例子中的Width附加属性更改为WidthP附加属性,这样更改完之后,xaml就报错了。你可以把那个例子的代码拷过去试验一下就出来了。。。必须得Width,怎么会这样呢???

    2015年12月30日 9:36