0

私はepgsのリストをロードする必要があるWindows Phone 8アプリで書いています。そのために、リストボックスとデータテンプレートを使用しています。

<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>

ご覧のとおり、1 つの EpgProgressBar を使用し、それが現在の Epg である場合にのみ表示します。ビューは正しく設定されており、現在の EPG の進行状況バーのみが表示されます。しかし、私の出力では、各ボタンに 1 つのプログレス バーがあることがわかります。

このコントロールが折りたたまれているか非表示になっている場合、カスタム コントロール (私の場合はプログレス バー) を読み込まない方法はありますか?

よろしく。

4

1 に答える 1

1

IIRC、実際にビューに配置されたコントロールは、その状態に関係なく作成/ロードされます。だから、直接、いや、仕方がない。

ただし、「可視性」ではなく、「ビューに配置する」自体をターゲットにすることで効果を得ることができます。

起動時にすべてを初期化して事前に配置したり、さまざまな状態の変化に応じて可視性を変更したりしないでください。これにより、ほとんどのUI要素が..隠されている大量のUI要素が残ります。

代わりに、穴を残します。ContentControl や ContentPresenter など、通常は非表示になっている要素をプレースホルダーに置き換えてから、それらのプレースホルダー用のスタイル/テンプレートを準備します。少なくとも 1 つは目的の適切なコンテンツ (つまり、プログレスバー) で、オプションで 2 つ目 (ボタン「clickme」) を使用します。プレースホルダーを空にするためだけに「空の」ものは必要ありません。最後に、コンテンツの「可視性」を切り替えたいときはいつでも、Content代わりにプレースホルダーのプロパティを切り替えて、viewtemplate#1 または viewtemplate#2 を有効にするか、nullプレースホルダーを空のままにします。

アプリケーション全体を構築する「大きな」ビューと区別するために、これらをマイクロビューと呼ぶことがありますが、実際には、これはほとんど同じメカニズムであり、実際には WPF のコンテンツ表示の中核です。

正味の効果は、少なくとも次のようになります。

  • 必要ない場合 (content=null)、何もロードされません (軽量のプレースホルダーを除く)
  • 必要に応じて (content=myprogressbardata)、正しい内容が表示されます (mytemplate_with_progressbar)
  • 新しいコンテンツ タイプでビュー構造を簡単に拡張できます (異なるコンテンツ タイプを設定するだけで、異なるマイクロビュー タイプが表示されます)。
  • スタイルとテンプレートは、無数の方法でオンとオフを切り替えることができます。それらはデータ型にバインドでき、トリガーを介して設定でき、上位スタイルから継承できます (...)

短所:

  • 実際のマイクロビューはテンプレートの形式です。これにより、データ/イベント/コマンドのバインドが難しくなりますが、XAML の手段によって可能になります。
于 2013-03-07T10:45:15.673 に答える