2016-07-06 5 views
1

コードビハインドで、別の要素が使用している元のコントロールテンプレート内の名前付き要素の1つにアクセスしたいとします。 コードビハインドを使用してControlTemplateの名前付き要素にアクセスするにはどうすればよいですか?

この

は、XAMLコードの例である(当然、元はもっと複雑である、または私はXAMLでこれをやっていると思います):

<Window x:Class="Temp.MainWindow" Title="MainWindow"> 
    <Window.Resources> 
     <ControlTemplate x:Key="MyTemplate" TargetType="{x:Type Expander}"> 
      <Expander Header="Some header"> 
       <StackPanel> 
        <Grid Name="MyGrid"/> 
       </StackPanel> 
      </Expander> 
     </ControlTemplate> 
    </Window.Resources> 
    <Grid> 
     <Expander Name="expander" Template="{DynamicResource MyTemplate}"/> 
    </Grid> 
</Window> 

私が試したもの:

public MainWindow() 
{ 
    InitializeComponent(); 
    Grid grid = expander.Template.FindName("MyGrid", expander) as Grid; 
} 

私はまた

Grid grid = expander.Template.Resources.FindName("MyGrid") as Grid; 

しかしgは常にnullで試してみました。

私が見てきた:上記のリンクは、私は私が働いているコードを得た方法ですが、

何らかの理由gは、常にnullです。 ContentTemplateに何か問題がありますか?どんな助けもありがとう!

答えて

1

あなたは、テンプレートを

protected override OnApplyTemplate() 
{ 
    Grid grid = Template.FindName("YourTemplateName") as Grid; 
} 

制御に適用されるまで、ここでの本当の問題は、あなたが技術を混合しているということです待つ必要があります。メインウィンドウの背後にあるコードで、見た目のコントロールのテンプレートを取得するためのものを使用しようとしています。あなたがもっと問題にぶつからなかったら私は驚くでしょう。

代わりに、How to Create Lookless Controlsを調べて、アプリケーションを再設計することをお勧めします。それは多大な努力を要せず、すべて一緒にうまくいくだろう。

+0

ありがとうございましたが、動作しませんでした( 'grid'はまだ' null'です)。私はルックレスコントロールを調べますが、私はWPFをほとんど理解していないことを発見しました。私はそう思っていました。 一時的な修正として、テンプレートの使用を避け、同じコードを繰り返し使用することをお勧めします。 –

+0

@Debraええ、それはあなたのせいではありません。すべてがうまくいっていくためには、必要なすべての訓練を受けるのに数年かかります。技術は少し混じり合っていますが、複雑なことをやり始めるとうまくいきません。 MVVMアーキテクチャーを学び、無意味なコントロールを構築する方法を学ぶことになるでしょう。あなたは自分自身に感謝し、最も多くのことよりも進んでいきます。 –

関連する問題