Xaml 如何根据屏幕大小更改样式?

Xaml 如何根据屏幕大小更改样式?,xaml,uwp,visualstatemanager,Xaml,Uwp,Visualstatemanager,我想根据屏幕大小更改堆叠面板的方向 我一直在跟踪,但还没有开始工作 以下是到目前为止我得到的信息: <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="SharedVisualStates"> <VisualState x:Name="DefaultLayout"> <VisualState.StateTriggers>

我想根据屏幕大小更改堆叠面板的方向

我一直在跟踪,但还没有开始工作

以下是到目前为止我得到的信息:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="SharedVisualStates">
        <VisualState x:Name="DefaultLayout">
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="720" />
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="GuidesList.Style" Value="{StaticResource DefaultGuidesList}" />
            </VisualState.Setters>
        </VisualState>
        <VisualState x:Name="NarrowLayout">
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="0" />
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="GuidesList.Style" Value="{StaticResource NarrowGuidesList}" />
            </VisualState.Setters>
        </VisualState>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

<Page.Resources>
    <Style x:Key="DefaultGuidesList" TargetType="StackPanel" >
        <Setter Property="Orientation" Value="Horizontal"/>
    </Style>

    <Style x:Key="NarrowGuidesList" TargetType="StackPanel" >
        <Setter Property="Orientation" Value="Vertical"/>
    </Style>
</Page.Resources>

<StackPanel
    x:Name="GuidesList">
    <StackPanel ... />
    <StackPanel ... />
</StackPanel>


有什么想法吗?

你也可以用以前的好方法来做。
在XAML中添加两种可视状态:

    <StackPanel x:Name="GuidesList">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup>
            <VisualState x:Name="HorLayout">
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GuidesList" Storyboard.TargetProperty="Orientation">
                        <DiscreteObjectKeyFrame KeyTime="0" Value="Horizontal"/>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </VisualState>
            <VisualState x:Name="VertLayout">
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GuidesList" Storyboard.TargetProperty="Orientation">
                        <DiscreteObjectKeyFrame KeyTime="0" Value="Vertical"/>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
   .....

.....
和处理页面大小更改事件:

  private void Page_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        if (e.NewSize.Width < 700)
        {
            VisualStateManager.GoToState(this, "VertLayout", true);
        }
        else
        {
            VisualStateManager.GoToState(this, "HorLayout", true);
        }
    }
private void页面\u SizeChanged(对象发送方,SizeChangedEventArgs e)
{
如果(如NewSize.Width<700)
{
VisualStateManager.GoToState(此“VertLayout”,true);
}
其他的
{
VisualStateManager.GoToState(这是“HorLayout”,true);
}
}

你也可以用旧的好方法来做。
在XAML中添加两种可视状态:

    <StackPanel x:Name="GuidesList">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup>
            <VisualState x:Name="HorLayout">
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GuidesList" Storyboard.TargetProperty="Orientation">
                        <DiscreteObjectKeyFrame KeyTime="0" Value="Horizontal"/>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </VisualState>
            <VisualState x:Name="VertLayout">
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GuidesList" Storyboard.TargetProperty="Orientation">
                        <DiscreteObjectKeyFrame KeyTime="0" Value="Vertical"/>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
   .....

.....
和处理页面大小更改事件:

  private void Page_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        if (e.NewSize.Width < 700)
        {
            VisualStateManager.GoToState(this, "VertLayout", true);
        }
        else
        {
            VisualStateManager.GoToState(this, "HorLayout", true);
        }
    }
private void页面\u SizeChanged(对象发送方,SizeChangedEventArgs e)
{
如果(如NewSize.Width<700)
{
VisualStateManager.GoToState(此“VertLayout”,true);
}
其他的
{
VisualStateManager.GoToState(这是“HorLayout”,true);
}
}

根据您的代码,您将
VisualStateManager
放错了位置。要使其正常工作,可以将
VisualStateManager.VisualStateGroups
添加到页面的根元素中

控件作者或应用程序开发人员使用附加属性将对象元素添加到XAML中控件模板定义的根元素中

有关更多信息,请参阅

因此,我更改了您的代码,如下所示:

<Page x:Class="UWP.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:local="using:UWP"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d">
    <Page.Resources>
        <Style x:Key="DefaultGuidesList" TargetType="StackPanel">
            <Setter Property="Orientation" Value="Horizontal" />
        </Style>
        <Style x:Key="NarrowGuidesList" TargetType="StackPanel">
            <Setter Property="Orientation" Value="Vertical" />
        </Style>
    </Page.Resources>

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="SharedVisualStates">
                <VisualState x:Name="DefaultLayout">
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="720" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="GuidesList.Style" Value="{StaticResource DefaultGuidesList}" />
                    </VisualState.Setters>
                </VisualState>
                <VisualState x:Name="NarrowLayout">
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="0" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="GuidesList.Style" Value="{StaticResource NarrowGuidesList}" />
                    </VisualState.Setters>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>

        <StackPanel x:Name="GuidesList">
            <StackPanel Width="400"
                        Height="200"
                        Background="Red" />
            <StackPanel Width="400"
                        Height="200"
                        Background="Blue" />
        </StackPanel>
    </Grid>
</Page>


根据您的代码,您将
VisualStateManager
放错了位置。要使其正常工作,可以将
VisualStateManager.VisualStateGroups
添加到页面的根元素中

控件作者或应用程序开发人员使用附加属性将对象元素添加到XAML中控件模板定义的根元素中

有关更多信息,请参阅

因此,我更改了您的代码,如下所示:

<Page x:Class="UWP.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:local="using:UWP"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d">
    <Page.Resources>
        <Style x:Key="DefaultGuidesList" TargetType="StackPanel">
            <Setter Property="Orientation" Value="Horizontal" />
        </Style>
        <Style x:Key="NarrowGuidesList" TargetType="StackPanel">
            <Setter Property="Orientation" Value="Vertical" />
        </Style>
    </Page.Resources>

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="SharedVisualStates">
                <VisualState x:Name="DefaultLayout">
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="720" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="GuidesList.Style" Value="{StaticResource DefaultGuidesList}" />
                    </VisualState.Setters>
                </VisualState>
                <VisualState x:Name="NarrowLayout">
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="0" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="GuidesList.Style" Value="{StaticResource NarrowGuidesList}" />
                    </VisualState.Setters>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>

        <StackPanel x:Name="GuidesList">
            <StackPanel Width="400"
                        Height="200"
                        Background="Red" />
            <StackPanel Width="400"
                        Height="200"
                        Background="Blue" />
        </StackPanel>
    </Grid>
</Page>


很高兴知道如何以编程方式处理此问题,干杯!很高兴知道如何以编程方式处理此问题,干杯!