2016-05-23 27 views
1

我正在研究UWP應用程序。我已經在使用自適應觸發器來根據窗口的寬度來調整我的xaml,並且它只能在頁面中工作。自適應觸發器在用戶控件中不起作用

現在我想爲用戶控件的xaml執行相同的操作,但它不工作。但是,我將VisualStateManager放到了用戶控件的根網格中。

有區別嗎?

這裏是我的用戶控件的代碼:

<UserControl 
    x:Class=.....> 

<UserControl.Resources> 
    <ResourceDictionary> 
     <vm:ViewModelLocator x:Key="Locator"/> 
     <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 
    </ResourceDictionary> 
</UserControl.Resources> 

<UserControl.DataContext> 
    <Binding Path="MyUserControlVM" Source="{StaticResource Locator}"/> 
</UserControl.DataContext> 


<Grid x:Name="LayoutRoot" Background="white"> 

    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup> 
      <VisualState x:Name="Narrow"> 
       <VisualState.StateTriggers> 
        <AdaptiveTrigger MinWindowWidth="0" /> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="LastName.Foreground" Value="Red" /> 
        <Setter Target="LastName.Fontsize" Value="10" /> 
        <Setter Target="FirstName.Foreground" Value="Red"/> 
       </VisualState.Setters> 
      </VisualState> 
      <VisualState x:Name="Normal"> 
       <VisualState.StateTriggers> 
        <AdaptiveTrigger MinWindowWidth="600" /> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="LastName.Foreground" Value="Red" /> 
        <Setter Target="LastName.Fontsize" Value="25" /> 
        <Setter Target="FirstName.Foreground" Value="Red"/> 
       </VisualState.Setters> 
      </VisualState> 
      <VisualState x:Name="Wide"> 
       <VisualState.StateTriggers> 
        <AdaptiveTrigger MinWindowWidth="1000"/> 
       </VisualState.StateTriggers> 
       <VisualState.Setters> 
        <Setter Target="LastName.Foreground" Value="Red" /> 
        <Setter Target="FirstName.Foreground" Value="Red"/> 
       </VisualState.Setters> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 

    <Listbox> 
     ... 
    </ListBox> 
    <TextBlock x:Name="lblNoData" Grid.ColumnSpan="2" Text="No Data" Visibility="{Binding NoDataVisible, Converter={StaticResource BooleanToVisibilityConverter}}"/> 
    <ProgressRing x:Name="prLoading" Width="60" Height="60" Foreground="Blue" IsActive="{Binding InitializationNotifier.IsNotCompleted}" /> 
</Grid> 

(「姓氏」和「名字」在我的ListBox的DataTemplate中的TextBlocks我只是試圖把我的文字以紅色爲。看的時候觸發工作)

我呼籲用戶控制一個簡單的頁面是這樣的:

<Grid x:Name="LayoutRoot" Background="{StaticResource white}"> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <StackPanel Grid.Row="0" Margin="0,0,0,10"> 
     ... 
    </StackPanel> 

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="10,0"> 
     <UC:MyUserControl/> 
    </Grid> 
</Grid> 

我不明白爲什麼這個代碼將無法正常工作。預先感謝您的幫助 !

回答

1

(「姓氏」和「名字」在我的列表框的DataTemplate中的TextBlocks。我只是試圖把我的文字爲紅色,以看到,當觸發器工作)

你可以參考我的另一個答案here,正如我在答案中所說的那樣,當控件放在DataTemplate中時,它們將成爲數據對象的可視化結構。我認爲只有在xaml代碼中沒有乾淨的方式來完成這項工作,這裏的數據綁定是你的朋友。

從你的代碼,我可以看到你想改變Foreground(但都Red?)和TextBlock S的依賴於窗口的大小DataTemplate內的FontSize。因此,您可以將這兩個屬性綁定到窗口大小,或者可以在窗口大小更改時使用ItemsControl.ItemTemplateSelector來選擇不同的模板。

+0

謝謝,那是我正在尋找的解釋! – Manon