2014-11-24 128 views
0

當我試圖模板一個WPF組合框時,遇到了一個奇怪的問題。我有一個第三方DLL將給定的控件序列化爲一個字符串。當我給了具有以下模板的ComboBox時,我得到一個錯誤,說「異常已被調用的目標拋出。與IsItemsHost =」true「的面板不嵌套在ItemsControl中。面板必須嵌套在ItemsControl中以獲得並展示物品。「組合框模板問題

<Style x:Key="ComboBoxStyle" TargetType="{x:Type ComboBox}"> 
    <Setter Property="SnapsToDevicePixels" Value="true"/> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
    <Setter Property="ScrollViewer.CanContentScroll" Value="true"/> 
    <Setter Property="Width" Value="{Binding}"/> 
    <Setter Property="Height" Value="{Binding}"/> 
    <Setter Property="Foreground" Value="White"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ComboBox}"> 
       <Grid> 
        <ToggleButton 
         Name="ToggleButton" 
         Template="{StaticResource ComboBoxToggleButton}" 
         Grid.Column="2" 
         Focusable="false" 
         Foreground="{TemplateBinding Foreground}" 
         Background="{TemplateBinding Background}" 
         IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}" 
         ClickMode="Press"> 
        </ToggleButton> 
        <ContentPresenter Name="ContentSite" IsHitTestVisible="False" Content="{TemplateBinding SelectionBoxItem}" 
         ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" 
         ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" 
         Margin="3,0,23,3" 
         VerticalAlignment="Center" 
         HorizontalAlignment="Center" /> 
        <TextBox x:Name="PART_EditableTextBox" 
         Style="{x:Null}" 
         Template="{StaticResource ComboBoxTextBox}" 
         HorizontalAlignment="Left" 
         VerticalAlignment="Center" 
         Margin="3,0,23,3" 
         Focusable="True" 
         Background="{TemplateBinding Background}" 
         Foreground="{TemplateBinding Foreground}" 
         Visibility="Hidden" 
         IsReadOnly="{TemplateBinding IsReadOnly}"/> 
        <Popup 
         Name="Popup" 
         Placement="Bottom" 
         IsOpen="{TemplateBinding IsDropDownOpen}" 
         AllowsTransparency="True" 
         Focusable="False" 
         PopupAnimation="Slide"> 

         <Grid Name="DropDown" 
          SnapsToDevicePixels="True"     
          MinWidth="{TemplateBinding ActualWidth}" 
          MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
          <Border 
          x:Name="DropDownBorder" 
          Background="{TemplateBinding Background}" 
          BorderThickness="1" 
          BorderBrush="#888888"/> 
          <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True"> 
           **<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />** 
          </ScrollViewer> 
         </Grid> 
        </Popup> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
    </Style.Triggers> 
</Style> 

樣式在控件上正常工作,但序列化給我帶來了問題。我懷疑我粘貼的代碼段中的'**'有問題。是否有不同的方式來實現組合框樣式?

+0

您使用了哪個第三方工具? – 2014-11-24 10:15:39

回答

0

ComboBoxItemsControl。這意味着ItemsPresenter預計在模板中(您的**StackPanel所在的地方)。如果您想要更改面板,ComboBox用於渲染項目,請更改ComboBoxItemsPanel模板。

+0

我明白你的觀點。那麼,我需要做些什麼修改才能讓我的上述模板正常工作? – Anee 2014-11-24 15:38:04

+0

是的,我用ItemsPresenter替換了StackPanel,它工作:)感謝您的幫助。 – Anee 2014-11-24 15:59:35