2013-06-08 5 views
6

컨트롤의 DependencyProperty을 기반으로 ListBoxItemsPanelTemplate 속성을 설정해야합니다. DataTemplateSelector을 사용하면 어떻게됩니까? 여기Wpf 변경하는 방법 목록 상자 ItemspanelTemplate을 사용하여 트리거

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <!-- Here I need to replace with either a StackPanel or a wrap panel--> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 

(ItemsPanelTemplate Selector in wpf?) 비슷한 질문와 링크는 다음과 같습니다

내가 좋아하는 뭔가가있다. 다음은 내 코드하지만이 작동하지입니다 :

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 
     <XmlDataProvider x:Key="myXmlDataBase" XPath="/myXmlData"> 
      <x:XData> 
       <myXmlData xmlns=""> 
        <Item Name = "CoverSheet" SNo="1" Type="GrpBX" Image="C:\Work\00288511851128436163\N12201_0003_003\00000003.tif"/> 
        <Item Name = "HCFA" SNo="2" Type="GrpBX" Image="C:\Work\00288511851128436163\N12201_0003_003\00000004.tif"/> 
        <Item Name = "HCFA" SNo="3" Type="GrpBX" Image="C:\Work\00288511851128436163\N12201_0003_003\00000004.tif"/> 
        <Item Name = "HCFA" SNo="4" Type="GrpBX" Image="C:\Work\00288511851128436163\N12201_0003_003\00000004.tif"/> 
        <Item Name = "HCFA" SNo="5" Type="GrpBX" Image="C:\Work\00288511851128436163\N12201_0003_003\00000004.tif"/> 
        <Item Name = "HCFA" SNo="6" Type="GrpBX" Image="C:\Work\00288511851128436163\N12201_0003_003\00000004.tif"/> 
        <Item Name = "HCFA_CC" SNo="7" Type="GrpBX" Image="C:\Work\00288511851128436163\N12201_0003_003\00000005.tif"/> 
        <Item Name = "FrontPage" SNo="8" Type="GrpBX" Image="C:\Work\00288511851128436163\N12201_0003_003\N12201_0003_003I00.tif"/> 
       </myXmlData> 
      </x:XData> 
     </XmlDataProvider>    
    </Window.Resources> 

    <DockPanel> 
     <ListBox Name="lv" ItemsSource="{Binding Source={StaticResource myXmlDataBase},XPath=Item}" FontSize="12" Background="LightGreen" ItemsPanel="{Binding RelativeSource={RelativeSource Self}, Path=Background}"> 
      <ListBox.Resources>      
       <Style x:Key="ListBoxWrapStyle" TargetType="ListBox"> 
        <Setter Property="ItemsPanel"> 
         <Setter.Value> 
          <ItemsPanelTemplate> 
           <WrapPanel Width="{Binding FrameworkElement.ActualWidth),RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}" ItemWidth="{Binding (ListView.View).ItemWidth, RelativeSource={RelativeSource AncestorType=ListView}}" ItemHeight="{Binding (ListView.View).ItemHeight, RelativeSource={RelativeSource AncestorType=ListView}}" /> 
          </ItemsPanelTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 

       <Style x:Key="ListBoxHorizontalStackStyle" TargetType="ListBox"> 
        <Setter Property="ItemsPanel"> 
         <Setter.Value> 
          <ItemsPanelTemplate> 
           <StackPanel Width="{Binding (FrameworkElement.ActualWidth),RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}" Orientation="Horizontal" /> 
          </ItemsPanelTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 

       <Style x:Key="ListBoxVerticalStackStyle" TargetType="ListBox"> 
        <Setter Property="ItemsPanel"> 
         <Setter.Value> 
          <ItemsPanelTemplate> 
           <StackPanel Width="{Binding (FrameworkElement.ActualWidth),RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}" Orientation="Vertical" /> 
          </ItemsPanelTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </ListBox.Resources> 

      <ListBox.Style> 
       <Style TargetType="ListBox"> 
        <Style.Triggers> 
         <!-- Your Trigger.. --> 
         <Trigger Property="Background" Value="Green"> 
          <Setter Property="ItemsPanel" Value="{StaticResource ListBoxVerticalStackStyle}"/> 
         </Trigger> 

         <Trigger Property="Background" Value="LightBlue"> 
          <Setter Property="ItemsPanel" Value="{StaticResource ListBoxHorizontalStackStyle}"/> 
         </Trigger> 

         <Trigger Property="Background" Value="LightGreen"> 
          <Setter Property="ItemsPanel" Value="{StaticResource ListBoxWrapStyle}"/> 
         </Trigger> 
         </Style.Triggers> 
       </Style> 
      </ListBox.Style> 

      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Viewbox Stretch="Fill" HorizontalAlignment="Stretch" > 
         <Border BorderThickness="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" DataContext="{Binding}" BorderBrush="IndianRed" Margin="0" Height="Auto"> 
          <DockPanel> 
           <Image 
            DockPanel.Dock="Top" 
            Width="150" Margin="5" 
            HorizontalAlignment="Stretch" 
            VerticalAlignment="Stretch" 
            Height="Auto" x:Name="Myimage" 
            RenderOptions.BitmapScalingMode="HighQuality" Source="{Binding [email protected]}"> 
           </Image> 

           <Grid> 
            <TextBlock Text="{Binding [email protected]}" HorizontalAlignment="Center" FontWeight="Normal" FontSize="13" /> 
           </Grid> 
          </DockPanel> 
         </Border> 
        </Viewbox> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </DockPanel> 
</Window> 

내가 ListBoxVerticalStackStyle '만지고있어이 코드를 실행하는 동안.

답변

8

ItemsPanelTemplateSetter.Value으로 예상 할 때 Style을 설정하려고하면 오류가 발생합니다. 의 '의 ListBoxStyle보다 S'의 ItemPanelTemplate으로 자원을 정의하고 당신은

을 정렬해야합니다 같은 시도 :

<ListBox Name="lv" 
      Background="LightBlue" 
      FontSize="12" 
      ItemsSource="{Binding Source={StaticResource myXmlDataBase}, 
           XPath=Item}"> 
    <ListBox.Resources> 
    <ItemsPanelTemplate x:Key="ListBoxWrapTemplate"> 
     <WrapPanel Width="{Binding (FrameworkElement.ActualWidth), 
            RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}" 
        ItemHeight="{Binding (ListView.View).ItemHeight, 
             RelativeSource={RelativeSource AncestorType=ListView}}" 
        ItemWidth="{Binding (ListView.View).ItemWidth, 
             RelativeSource={RelativeSource AncestorType=ListView}}" /> 
    </ItemsPanelTemplate> 
    <ItemsPanelTemplate x:Key="ListBoxHorizontalStackTemplate">  
     <StackPanel Width="{Binding (FrameworkElement.ActualWidth), 
            RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}" 
        Orientation="Horizontal" />  
    </ItemsPanelTemplate> 
    <ItemsPanelTemplate x:Key="ListBoxVerticalStackTemplate"> 
     <StackPanel Width="{Binding (FrameworkElement.ActualWidth), 
            RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}" 
        Orientation="Vertical" /> 
    </ItemsPanelTemplate> 
    </ListBox.Resources> 
    <ListBox.Style> 
    <Style TargetType="ListBox"> 
     <Style.Triggers> 
     <!-- Your Trigger.. --> 
     <Trigger Property="Background" 
        Value="Green"> 
      <Setter Property="ItemsPanel" 
        Value="{DynamicResource ListBoxVerticalStackTemplate}" /> 
     </Trigger> 
     <Trigger Property="Background" 
        Value="LightBlue"> 
      <Setter Property="ItemsPanel" 
        Value="{DynamicResource ListBoxHorizontalStackTemplate}" /> 
     </Trigger> 
     <Trigger Property="Background" 
        Value="LightGreen"> 
      <Setter Property="ItemsPanel" 
        Value="{DynamicResource ListBoxWrapTemplate}" /> 
     </Trigger> 
     </Style.Triggers> 
    </Style> 
    </ListBox.Style> 
    ... 
+0

덕분에 많은 완벽하게 잘 작동하고 또한 내가 ** 정적 리소스 ** ratherthan ** DynamicResource ** 변경과 내가 하나 더 문제 때와 붙어있어 ** ListBoxWrapTemplate ** 사실 HorizontalScroll bar **와 함께 Horzontally로 정렬 된 이미지가 래핑되지 않습니다. ** HorizontalScroll bar **는 원하지 않지만 이미지는 래핑되어야합니다. – Selva

+0

작업 할 디자인에 대한 수정이 있습니까? ** ListBoxWraptemplate ** ?? 안내해주십시오. 고맙습니다. – Selva

+0

@Selva 'WrapPanel'의 Width가'Wrap = '을 설정하려고 시도하지 않았기 때문에 생각합니다.'Width = "{Binding Path = ActualWidth, RelativeSource = {RelativeSource FindAncestor, AncestorType = {x : Type ListBox}}} "''WrapPanel' – Viv

1
비비안의 대답은 여기입니다 :-(내 경우에는 작동하지 않는 이유가 궁금

을 내가 잘못했다!.

당신이 어떤 영향을 미칠되지 않습니다 <Listbox.ItemPanel></Listbox.ItemPanel> 스타일의 트리거에서 하나를 배치하는 경우 <Style.Triggers> 에서 ItemsPanelTemplate의 아파트를 정의하지 마십시오

아르노.

추신 : 단지 의견에 충분한 명성을 ...