2010-11-23 8 views
1

私は、WPFアプリケーションのチューナーカードからTVを再生するプロジェクトに取り組んでいます。最近、私はWPF MediaKitで動作するようにテレビの再生機能を書き直していました(以前はWindowsFormsHostとWinFormsコントロールをDirectShowのレンダリングターゲットとして使用していたため、通常の空きスペースの問題が発生しました)。テンプレート外のボタンのCommandTargetとしてDataTemplateのコントロールを設定する

ソフトウェアは、アナログとデジタルテレビの両方を果たしており、それらは異なる方法で処理されているように、私はそれぞれのMediaKitクラスMediaPlayerBaseMediaElementBaseから延びる、(DigitalTvPlayerDigitalTvElementAnalogTvPlayerAnalogTvElement)の両方のためのPlayerMediaElementを作成しました。

これらのコントロールはすべて動作していますが、チャンネルの一覧(アナログとデジタルが混在している)を含むことができる単一の「TVプレーヤーウィンドウ」を用意し、適切なプレーヤー。次のウィンドウ本体と

<Window.Resources> 
    <DataTemplate DataType="{x:Type Channels:AnalogChannel}"> 
     <Controls:AnalogTvGraphFileElement 
      AnalogSpecificData="..." 
      Channel="{Binding}" /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type Channels:DigitalChannel}"> 
     <Controls:DigitalTvElement 
      DigitalSpecificData="..." 
      Channel="{Binding}" /> 
    </DataTemplate> 
</Window.Resources> 

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
    <ContentPresenter 
     x:Name="TvPresenter" 
     VerticalAlignment="Stretch" 
     HorizontalAlignment="Center" 
     Content="{Binding ElementName=TvChannels, Path=SelectedItem}" /> 

    <ListBox Grid.Column="1" x:Name="TvChannels" ItemsSource="{Binding Channels}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}" /> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

が、これを行うことで

私の最初の試みは、選択したチャンネルに結合さContentPresenter、各チャネルタイプのための特定のDataTemplateを使用して関与しましたこのアプローチは「うまくいく」(テレビの演奏、それはアナログとデジタルの間で自動的に切り替わる)、TvElementsを直接制御する能力を失う。例えば、MediaCommands.Play、私はContentPresenterまたはそのバインドChannelオブジェクトへの参照のみを持っています。

理想的には、私は(それはおそらくDataTemplate外となります)ButtonCommandTargetとしてこれらTvPlayer秒のいずれかを設定できるようにしたいと思います。しかし、私はそのことをどうやってやっていくのかについてはわかりません(それは良いアイデアでもありません)。DataTemplateで特定のコントロールを探しているとハックしてエラーが発生しやすくなります。

私は何かが不足していると感じたり、間違ったやり方をしているように感じます。プレイヤーにコマンドを実行する能力を失うことなく、チャンネルを扱う一般的な(できれば宣言的な)手段をどのように達成できるかについて、アドバイスや提案がありますか?

答えて

1

Loadedイベントを使用してコード内のフィールドを設定できます。

<Window.Resources> 
    <DataTemplate DataType="{x:Type Channels:AnalogChannel}"> 
     <Controls:AnalogTvGraphFileElement 
      AnalogSpecificData="..." Loaded="OnAnalogTvGraphFileElementLoaded"    Channel="{Binding}" /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type Channels:DigitalChannel}"> 
     <Controls:DigitalTvElement 
      DigitalSpecificData="..." Loaded="OnDigitalTvElementLoaded" 
      Channel="{Binding}" /> 
    </DataTemplate> 
</Window.Resources> 

とロードされたメソッドは、背後にあるコードであなたのフィールドを設定します:

private AnalogTvGraphFileElement analogFileElement; 

private void OnAnalogTvGraphFileElementLoaded(object sender, RoutedEventArgs e) 
{ 
    analogFileElement = (AnalogTvGraphFileElement) sender; 
} 

を必要なときにそう、あなたは正しいコントロールを持つことになり、最初にそれらを探す必要がありません。

+0

ありがとうございました。私はEventHandlerをDataTemplatesに設定でき、Loadedイベントは考慮していませんでした。私はこれが必要に応じて動作すると思います! – jeffora

+0

問題はありません。うれしいです! – Arcturus

関連する問題