internal void UpdateEnabled() { if (UseFormsVsm) { var state = IsEnabled ? "FormsNormal" : "FormsDisabled"; WVisualStateManager.GoToState(this, state, true); } }
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); }
/* * 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; }
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); }