2013-03-07 33 views
0

我正在寫的Windows Phone 8應用程序,它必須加載一個epgs列表。 爲此,我使用了一個列表框和一個數據模板。不加載自定義控件,如果它被摺疊

<DataTemplate x:Key="FooDataTemplate"> 
    <Button Margin="0,10,0,0" Style="{Binding Source={StaticResource ButtonNoMarginStyle}}" BorderThickness="0" Width="375" Height="105" Command="{Binding ElementName=pageRoot,Path=ViewModel.NavigateToDetailsCommand}" CommandParameter="{Binding Id}"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="180"/> 
       <ColumnDefinition Width="195"/> 
      </Grid.ColumnDefinitions> 

      <Grid Grid.Column="0"> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="*"/> 
        <RowDefinition Height="25"/> 
       </Grid.RowDefinitions> 
       <controls:ImageControl ImageUri="{Binding Image}" Grid.RowSpan="2" Grid.Column="0" /> 
       <Image Grid.RowSpan="2" Source="{StaticResource SecondCaptionImage}" Grid.Column="0" VerticalAlignment="Top" HorizontalAlignment="Right" Stretch="None"/> 
       <Grid Grid.Row="1" Visibility="{Binding IsCurrentEpg, Converter={StaticResource BooleanToVisibilityConverter}}"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="10"/> 
         <ColumnDefinition Width="*"/> 
         <ColumnDefinition Width="auto"/> 
         <ColumnDefinition Width="10"/> 
        </Grid.ColumnDefinitions> 
        <Rectangle Fill="#cc3e567b" Grid.ColumnSpan="4"/> 
        <TextBlock Text="DIRECT" FontSize="12" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
        <TextBlock Text="{Binding Duration}" FontSize="12" Grid.Column="2" VerticalAlignment="Center"/> 
       </Grid> 
      </Grid> 

      <Grid Grid.Column="1" VerticalAlignment="Top" Margin="10,-8,0,0"> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="auto"/> 
        <!--Title--> 
        <RowDefinition Height="auto"/> 
        <!--SubTitle--> 
        <RowDefinition Height="auto"/> 
        <!--Hours--> 
        <RowDefinition Height="auto"/> 
        <!--Progress bar if needed--> 
       </Grid.RowDefinitions> 
       <TextBlock TextTrimming="WordEllipsis" Text="{Binding Title, Converter={StaticResource CaseStringConverter}, ConverterParameter=Upper}"/> 
       <TextBlock Grid.Row="1" TextTrimming="WordEllipsis" Text="{Binding Subtitle, Converter={StaticResource CaseStringConverter}, ConverterParameter=Upper}"/> 
       <TextBlock Grid.Row="2" Text="{Binding DurationTitle}"/> 
       <Grid Margin="-4,0,0,0" Grid.Row="3" Visibility="{Binding IsCurrentEpg, Converter={StaticResource BooleanToVisibilityConverter}}" > 
        <controls:EpgProgressBar Visibility="{Binding IsCurrentEpg, Converter={StaticResource BooleanToVisibilityConverter}}" Loaded="SecondProgressBarLoaded" IsEnabled="{Binding IsCurrentEpg}" CurrentEpg="{Binding}" Width="375" HorizontalAlignment="Left" /> 
       </Grid> 

      </Grid> 
     </Grid> 
    </Button> 
</DataTemplate> 

正如你所看到的,我使用了一個EpgProgressBar,並且只有當它是當前的epg時才顯示它。該視圖已正確設置,我只獲取當前epg的進度條。但是,我可以在輸出中看到每個按鈕都有一個進度條。

如果此控件被摺疊或隱藏,有沒有辦法加載自定義控件(在我的情況下是進度條)?

問候。

+0

只是爲了澄清,是「EPG」一個http://en.wikipedia.org/wiki/Electronic_program_guide? – quetzalcoatl 2013-03-07 10:34:22

+0

是的,它是一個電視節目的清單。 – David 2013-03-07 10:35:27

回答

1

IIRC,實際放置在視圖上的控件將被創建/加載,而與其狀態無關。所以,直接,不,沒有辦法。

但是,您可以通過將目標設置爲「可見性」而不是「將其置於視圖」本身來實現該效果。

不要在啓動時初始化和預先放置所有內容,並且不要根據各種狀態更改來更改可見性。這給你留下了大量的ui元素,其中大部分是隱藏的。

相反,留下孔。替換那些通常用佔位符(即ContentControl或ContentPresenter)隱藏的元素,然後爲這些佔位符準備樣式/模板:至少一個帶有您所需的正確內容(即進度條)和可選的第二個(帶有「clickme」按鈕)。你不需要一個「空的」,只是爲了讓佔位符爲空。最後,只要您希望切換內容的「可見性」,請切換佔位符的Content屬性,以激活視圖模板#1或視圖模板#2或null以使佔位符爲空。我有時候喜歡稱它們爲microviews,以區別於構建整體應用程序的「大」視圖,但事實上,這幾乎是相同的機制,實際上它是WPF內容顯示的核心。

的淨效果將是,至少爲:

  • 如果不需要(含量=空),沒有加載(除了輕量的佔位符)
  • 需要時(含量= myprogressbardata),正確的內容顯示(mytemplate_with_progressbar)
  • 您可以輕鬆地擴展新的內容類型viewstructure(只設置不同的內容類型 - >得到明顯不同微視的類型)
  • 風格和模板可以打開和關閉以無數種方法進行切換;它們可以綁定到數據類型,它們可以通過觸發器設置,可以從風格上繼承,(...)

缺點:

  • 實際microviews是模板形式。這使得數據/事件/命令結合更難,但仍然是可能的,仍然通過XAML裝置