在WPF样式中:ItemsPanel如何从模板中找到要替换的内容(在ItemsControl中)

在WPF样式中:ItemsPanel如何从模板中找到要替换的内容(在ItemsControl中),wpf,xaml,Wpf,Xaml,这是一个更不深入的技术问题,即事物如何实际工作。还有一种怀疑: ... <ListBox Style="{StaticResource lbs}"/> ... 。。。 ... 假设您在GUI中的某个地方有一个列表框,并且希望使用自定义面板(复杂的GridPanel)对其进行样式设置。假设我创建了这个样式,它的“模板”非常接近实际默认值:(无论如何简化了) ……等等。。。 因此,我们设置了模板(但使用StackPanel)和项目面板 现在:WPF样式系统是如何工作的?它将如

这是一个更不深入的技术问题,即事物如何实际工作。还有一种怀疑:

...
  <ListBox Style="{StaticResource lbs}"/>
...
。。。
...
假设您在GUI中的某个地方有一个列表框,并且希望使用自定义面板(复杂的GridPanel)对其进行样式设置。假设我创建了这个样式,它的“模板”非常接近实际默认值:(无论如何简化了)


……等等。。。
因此,我们设置了
模板
(但使用StackPanel)和
项目面板

现在:WPF样式系统是如何工作的?它将如何用
复杂的GridPanel
取代
StackPanel


我怀疑是模板的
StackPanel
上的Set属性
IsItemsHost=“True”
构成了指示器。这是真的吗?

据我所知,StackPanel不会被复杂的GridPanel取代,因为StackPanel在模板中作为项目主机进行了硬编码

如果将StackPanel更换为


只有这样,set ItemsPanel才会用作项目宿主。

你说得对。这实际上也有效。但是我想知道为什么微软在上面提到的风格默认网站里有一个里面没有的!°@Robetto MSDN网站具有误导性。它显示的是ControlTemplate示例,而不是实际的默认样式/模板。如果查看真正的默认样式(例如,在设计器中选择“编辑模板”),它会定义一个名为“ItemsPresenter”的ItemsPresenter。
   <Style x:Key="lbs">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBox">
                    <Border Name="Border" BorderThickness="1" CornerRadius="2" BorderBrush="AliceBlue" Background="Blue">
                        <StackPanel Margin="2" IsItemsHost="True" />
                    </Border>
                </ControlTemplate>    
            </Setter.Value>
        </Setter>
    <Setter Property="ItemsSource" Value="{Binding SeriesToDisplay}" />
    <Setter Property="ItemsPanel">
      <Setter.Value>
        <ItemsPanelTemplate>
          <local:SophisticatedGridPanel GridLineColor="Gray" />
        </ItemsPanelTemplate>
      </Setter.Value>
    </Setter>
    <Setter Property="ItemContainerStyle">
      <Setter.Value>
        ...bla...
      </Setter.Value>
    </Setter>
  </Style>