VisualStateManager未在UWP应用程序中设置附加属性Grid.Row和Grid.ColumnSpan

时间:2015-08-19 18:32:02

标签: xaml uwp win-universal-app winrt-xaml windows-10-mobile

我正在尝试使用Windows 10 Universal App项目中的VisualStateManager更改某些附加属性,但是setter无法正常工作。它没有设置我的TopBarGrid元素的附加属性。

如果你看下面我正在使用括号表示法来更改Grid.RowGrid.ColumnSpan属性。但是当我运行应用程序时,当我放大宽度时,属性不会被设置。我期待Grid能够移动到那个位置。

这是我的代码:

<Grid>
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup>
            <VisualState x:Name="wideState">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="641" />
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="splitView.DisplayMode" Value="Inline"/>
                    <Setter Target="splitView.IsPaneOpen" Value="True"/>
                    <Setter Target="togglePaneButton.Visibility" Value="Collapsed"/>
                    <Setter Target="appHeader.Margin" Value="0,0,0,0"/>
                    <Setter Target="PaneHeader.Margin" Value="6,12,0,0"/>
                    <Setter Target="TopBarGrid.(Grid.Column)" Value="0"/>
                    <Setter Target="TopBarGrid.(Grid.RowSpan)" Value="2"/>
                </VisualState.Setters>
            </VisualState>
            <VisualState x:Name="narrowState">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="0" />
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="splitView.DisplayMode" Value="Overlay"/>
                    <Setter Target="togglePaneButton.Visibility" Value="Visible"/>
                    <Setter Target="PaneHeader.Margin" Value="60,12,0,0"/>
                    <Setter Target="searchForInfoBox.Width" Value="270"/>
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Grid.RowDefinitions>
        <RowDefinition x:Name="TopRowHeight" Height="80"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="60"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid x:Name="TopBarGrid" Grid.Row="0" Grid.ColumnSpan="2">
        <toolbars:TopHorizontalToolBar/>
    </Grid>
    <Grid x:Name="LeftBarGrid" Grid.Column="0" Grid.RowSpan="2" Visibility="Collapsed">
        <toolbars:VerticalToolBar />
    </Grid>

2 个答案:

答案 0 :(得分:4)

您的代码看起来很不错,但是,在这两种状态下,您要将Row的{​​{1}}和ColumnSpan设置为相同的值。这就是为什么你不会看到任何变化。

尝试从一个州删除一套。

您仍然看不到任何更改的原因很可能是因为TopBarGrid中的Setter存在问题。

请尝试以下代码,请注意narrowState行为正确。

TopBarGrid

但是,当我向<Grid x:Name="LayoutRoot"> <VisualStateManager.VisualStateGroups> <VisualStateGroup> <VisualState x:Name="wideState"> <VisualState.StateTriggers> <AdaptiveTrigger MinWindowWidth="641" /> </VisualState.StateTriggers> <VisualState.Setters> <Setter Target="TopBarGrid.(Grid.Column)" Value="0" /> <Setter Target="TopBarGrid.(Grid.RowSpan)" Value="2" /> </VisualState.Setters> </VisualState> <VisualState x:Name="narrowState"> <VisualState.StateTriggers> <AdaptiveTrigger MinWindowWidth="0" /> </VisualState.StateTriggers> <VisualState.Setters> <Setter Target="TopBarGrid.Background" Value="Green" /> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <Grid> <Grid.RowDefinitions> <RowDefinition x:Name="TopRowHeight" Height="80" /> <RowDefinition Height="*" /> <RowDefinition Height="60" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid x:Name="TopBarGrid" Grid.Row="0" Grid.ColumnSpan="2" Background="Red" /> <Grid x:Name="LeftBarGrid" Grid.Column="0" Grid.RowSpan="2" Visibility="Collapsed" /> </Grid> </Grid> 投入更多Setter s(例如<Setter Target="PaneHeader.Margin" Value="60,12,0,0" />)时,它就会停止工作。我知道,我的测试页中甚至没有定义narrowState!但它也告诉我PaneHeader只是因为某种原因吞下错误。

因此,请尝试删除VSM并将它们一对一地添加以找到有问题的一个。那么这将是一个简单的修复。

答案 1 :(得分:0)

@Ray至于 TopBarGrid。(Grid.Column),你必须提供 PaneHeader。(FrameworkElement.Margin)