VisualState StateTriggers not working properly while launching the app from Start menu.

guess_me_if_u_can 126 Reputation points
2020-06-19T07:34:04.347+00:00

my VisualState StateTriggers aren't working correctly, but only while launching the app from search or start menu. If I start the app with VS in debug mode they work perfectly.

Control.xaml file:

<UserControl>
<StackPanel Tag="{x:Bind Tag, Mode=OneWay}" RightTapped="OnRightTapped" Background="Transparent" x:Name="MainPanel" Orientation="Vertical" >
        <ContentPresenter x:Name="NormalTemplatePresenter" Content="{x:Bind NormalTemplate, Mode=OneWay}" />
        <ContentPresenter x:Name="MasterTemplatePresenter" Content="{x:Bind MasterTemplate, Mode=OneWay}" />
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="ControlSizeStates">
                <!-- Fourth set of VisualStates for building responsive UI optimized based on Control size.
                     Take a look at ControlSizeTrigger.cs class in CustomTriggers folder to see how this is implemented -->
                <VisualState>
                    <VisualState.StateTriggers>
                        <Local:ControlSizeTrigger MinWidth="700" TargetElement="{x:Bind Path=MainPanel}" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="MasterTemplatePresenter.Visibility" Value="Visible" />
                        <Setter Target="NormalTemplatePresenter.Visibility" Value="Collapsed" />
                    </VisualState.Setters>
                </VisualState>
                <VisualState>
                    <VisualState.StateTriggers>
                        <Local:ControlSizeTrigger MinWidth="1" TargetElement="{x:Bind Path=MainPanel}" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="NormalTemplatePresenter.Visibility" Value="Visible" />
                        <Setter Target="MasterTemplatePresenter.Visibility" Value="Collapsed" />
                    </VisualState.Setters>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
    </StackPanel>
</UserControl>

ControlSizeTrigger.cs

    public class ControlSizeTrigger : StateTriggerBase
    {
        //private variables
        private double _minHeight, _minWidth = -1;
        private FrameworkElement _targetElement;
        private double _currentHeight, _currentWidth;
        //public properties to set from XAML
        public double MinHeight
        {
            get
            {
                return _minHeight;
            }
            set
            {
                _minHeight = value;
            }
        }
        public double MinWidth
        {
            get
            {
                return _minWidth;
            }
            set
            {
                _minWidth = value;
            }
        }
        public FrameworkElement TargetElement
        {
            get
            {
                return _targetElement;
            }
            set
            {
                if (_targetElement != null)
                {
                    _targetElement.SizeChanged -= _targetElement_SizeChanged;
                }
                _targetElement = value;
                _targetElement.SizeChanged += _targetElement_SizeChanged;
            }
        }
        //Handle event to get current values
        private void _targetElement_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            _currentHeight = e.NewSize.Height;
            _currentWidth = e.NewSize.Width;
            UpdateTrigger();
        }
        //Logic to evaluate and apply trigger value
        private void UpdateTrigger()
        {
            //if target is set and either minHeight or minWidth is set, proceed
            if (_targetElement != null && (_minWidth > 0 || _minHeight > 0))
            {
                //if both minHeight and minWidth are set, then both conditions must be satisfied
                if (_minHeight > 0 && _minWidth > 0)
                {
                    SetActive((_currentHeight >= _minHeight) && (_currentWidth >= _minWidth));
                }
                //if only one of them is set, then only that condition needs to be satisfied
                else if (_minHeight > 0)
                {
                    SetActive(_currentHeight >= _minHeight);
                }
                else
                {
                    SetActive(_currentWidth >= _minWidth);
                }
            }
            else
            {
                SetActive(false);
            }
        }
    }
Universal Windows Platform (UWP)
{count} votes

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.