Beispiel #1
0
 internal void UpdateEnabled()
 {
     if (UseFormsVsm)
     {
         var state = IsEnabled ? "FormsNormal" : "FormsDisabled";
         WVisualStateManager.GoToState(this, state, true);
     }
 }
Beispiel #2
0
        static void FocusPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
        {
            // If we're modifying the properties related to the focus state of the control (e.g.,
            // ForegroundFocusBrush), the changes won't be reflected immediately because they are only applied
            // when the Windows.UI.XAML.VisualStateManager moves to the "Focused" state. So we have to force a
            // "refresh" of the Focused state by going to that state again

            if (!(dependencyObject is Control control) || control.FocusState == FocusState.Unfocused)
            {
                return;
            }

            WVisualStateManager.GoToState(control, "Focused", false);
        }
Beispiel #3
0
        /*
         * The below serves as a way to disable the button visually, rather than using IsEnabled. It's a hack
         * but should remain stable as long as the user doesn't change the WinRT Button template too much.
         *
         * The reason we're not using IsEnabled is that the buttons have a click radius that overlap about 40%
         * of the next button. This doesn't cause a problem until one button becomes disabled, then if you think
         * you're still hitting + (haven't noticed its disabled), you will actually hit -. This hack doesn't
         * completely solve the problem, but it drops the overlap to something like 20%. I haven't found the root
         * cause, so this will have to suffice for now.
         */

        void PsuedoEnable(Control control, ref VisualStateCache cache)
        {
            if (cache == null || VisualTreeHelper.GetChildrenCount(control) == 0)
            {
                return;
            }

            var rootElement = (FrameworkElement)VisualTreeHelper.GetChild(control, 0);

            IList <WVisualStateGroup> groups = WVisualStateManager.GetVisualStateGroups(rootElement);

            if (cache.FocusStates != null)
            {
                groups.Add(cache.FocusStates);
            }

            var commonStates = groups.FirstOrDefault(g => g.Name == "CommonStates");

            if (commonStates == null)
            {
                return;
            }

            if (cache.Normal != null)
            {
                commonStates.States.Insert(0, cache.Normal);                 // defensive
            }
            if (cache.Pressed != null)
            {
                commonStates.States.Add(cache.Pressed);
            }
            if (cache.PointerOver != null)
            {
                commonStates.States.Add(cache.PointerOver);
            }

            WVisualStateManager.GoToState(control, "Normal", true);

            cache = null;
        }
Beispiel #4
0
        VisualStateCache PseudoDisable(Control control)
        {
            if (VisualTreeHelper.GetChildrenCount(control) == 0)
            {
                control.ApplyTemplate();
            }

            WVisualStateManager.GoToState(control, "Disabled", true);

            var rootElement = (FrameworkElement)VisualTreeHelper.GetChild(control, 0);

            var cache = new VisualStateCache();
            IList <WVisualStateGroup> groups = WVisualStateManager.GetVisualStateGroups(rootElement);

            WVisualStateGroup common = null;

            foreach (var group in groups)
            {
                if (group.Name == "CommonStates")
                {
                    common = group;
                }
                else if (group.Name == "FocusStates")
                {
                    cache.FocusStates = group;
                }
                else if (cache.FocusStates != null && common != null)
                {
                    break;
                }
            }

            if (cache.FocusStates != null)
            {
                groups.Remove(cache.FocusStates);
            }

            if (common != null)
            {
                foreach (WVisualState state in common.States)
                {
                    if (state.Name == "Normal")
                    {
                        cache.Normal = state;
                    }
                    else if (state.Name == "Pressed")
                    {
                        cache.Pressed = state;
                    }
                    else if (state.Name == "PointerOver")
                    {
                        cache.PointerOver = state;
                    }
                }

                if (cache.Normal != null)
                {
                    common.States.Remove(cache.Normal);
                }
                if (cache.Pressed != null)
                {
                    common.States.Remove(cache.Pressed);
                }
                if (cache.PointerOver != null)
                {
                    common.States.Remove(cache.PointerOver);
                }
            }

            return(cache);
        }