我正在写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 :(得分:1)
但是,你可以通过不是“可见性”而是“将它放在视图上”来实现效果。
不要在启动时初始化和预置所有内容,也不要根据各种状态更改来更改可见性。这会留下大量的ui元素,其中大部分是......隐藏的。
相反,留下漏洞。替换通常用占位符隐藏的元素,即ContentControl或ContentPresenter,然后为这些占位符准备样式/模板:至少一个具有所需的适当内容(即进度条)和可选的第二个(带有“clickme”按钮)。只是为了使占位符为空,您不需要“空”。最后,只要您想切换内容的“可见性” - 切换占位符的Content
属性,而不是激活viewtemplate#1或viewtemplate#2,或null
将占位符留空。
我有时喜欢将它们称为微观视图,以区别于构建整个应用程序的“大”视图,但事实上,这几乎是相同的机制,实际上是WPF内容显示的核心。
净效果至少是:
缺点: