7

テンプレート

<Style TargetType="{x:Type local:Viewport}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:Viewport}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ItemsPresenter/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <Canvas x:Name="PART_Canvas" IsItemsHost="True"/>
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

OnApplyTemplate のコード

content = this.Template.FindName("PART_Canvas", this) as FrameworkElement;

コンテンツは常に null を返しますが、なぜ機能しないのでしょうか?

これに置き換えると、プログラムは直接終了します

content = this.ItemsPanel.FindName("PART_Canvas", this) as FrameworkElement;
4

1 に答える 1

10

FindName宣言された要素のみを見つけることができますTemplateItemsPanelそのテンプレートの一部ではありません。アクセスできるプレースホルダーに入れますがItemsControl、最初にテンプレートに名前を付ける必要があります。ItemsPanelItemsPresenterCanvasItemsPresenter

<ControlTemplate TargetType="{x:Type local:Viewport}">
   <Border>
      <ItemsPresenter x:Name="PART_ItemsPresenter"/>
   </Border>
</ControlTemplate>

次に、VisualTreeHelperget yourを使用しますが、以下のコードを呼び出すことができる最も早い場所は、 isCanvasのときだと思います。これは私の例です:FrameWorkElementLoaded

public class MyListBox : ListBox
{
  public MyListBox()
  {
      AddHandler(FrameworkElement.LoadedEvent, new RoutedEventHandler(ControlIsLoaded));
  }

  private void ControlIsLoaded(object sender, RoutedEventArgs e)
  {
      var canvas = VisualTreeHelper.GetChild(this.Template.FindName("PART_ItemsPresenter", this) as DependencyObject, 0);
  }
}
于 2013-05-30T19:24:06.297 に答える