2013-03-07 14 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装置