0

我正在写 Windows Phone 8 应用程序,它必须加载一个 EPG 列表。为此,我使用了一个列表框和一个数据模板。

<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 的进度条。但是,我可以在输出中看到每个按钮都有一个进度条。

如果该控件被折叠或隐藏,有没有办法不加载自定义控件(在我的情况下是进度条)?

问候。

4

1 回答 1

1

IIRC,无论其状态如何,都将创建/加载实际放置在视图上的控件。所以,直接,不,没有办法。

但是,您可以通过定位不是“可见性”而是“将其放置在视图上”本身来实现效果。

不要在启动时初始化和预先放置所有内容,也不要根据各种状态更改来更改 Visibility。这给你留下了大量的 ui 元素,其中大部分是隐藏的。

相反,留下漏洞。将那些通常隐藏的元素替换为占位符,即 ContentControl 或 ContentPresenter,然后为这些占位符准备样式/模板:至少一个具有您想要的适当内容(即进度条)和可选的第二个(带有按钮“clickme”)。您不需要一个“空的”来使占位符为空。最后,任何时候你想切换内容的“可见性”——切换占位符的Content属性来激活 viewtemplate#1 或 viewtemplate#2,或者null将占位符留空。

我有时喜欢称它们为微视图,以区别于构建整个应用程序的“大”视图,但实际上,这几乎是相同的机制,实际上是 WPF 内容显示的核心。

净效应至少是:

  • 如果不需要(content=null),则不加载任何内容(轻量级占位符除外)
  • 需要时(content=myprogressbardata),显示正确的内容(mytemplate_with_progressbar)
  • 您可以使用新的内容类型轻松扩展视图结构(只需设置不同的内容类型 -> 让不同的微视图类型可见)
  • 样式和模板可以通过多种方式打开和关闭;它们可以绑定到数据类型,可以通过触发器设置,可以从上层样式继承,(...)

缺点:

  • 实际的微视图是模板的形式。这使得数据/事件/命令绑定更难,但仍然可能,仍然通过 XAML 手段
于 2013-03-07T10:45:15.673 回答