XAML将样式应用于多个列表框

时间:2017-05-16 20:58:07

标签: c# wpf xaml

我有这个XAML,目前有效。我想添加第二个ListBox,它与第一个Style相同。我想定义一个适用于两者的Style,而不是重复所有的XAML。我在<style></style>中尝试了Windows.Resources标记,但它不知道ListBox.GroupStyle是什么。我尝试了ListBox.GroupStyle,但它不知道TargetType参数是什么。我不确定我应该寻找什么来解决这个问题。大多数示例都涉及单个ListBox的样式,并直接在XAML中进行。

<Grid Width="Auto" HorizontalAlignment="Stretch">
  <Grid.RowDefinitions>
    <RowDefinition Height="*" />
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>
  <ListBox Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"
           HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch"
           Padding="0,0,10,10" ItemsSource="{Binding Path=ItemList}">
    <ListBox.GroupStyle>
      <GroupStyle>
        <GroupStyle.ContainerStyle>
          <Style TargetType="{x:Type GroupItem}">
            <Setter Property="Template">
              <Setter.Value>
                <ControlTemplate>
                  <Expander Header="{Binding Name}" IsExpanded="False">
                    <ItemsPresenter />
                  </Expander>
                </ControlTemplate>
              </Setter.Value>
            </Setter>
          </Style>
        </GroupStyle.ContainerStyle>
      </GroupStyle>
    </ListBox.GroupStyle>
    <ListBox.ItemTemplate>
      <DataTemplate>
        <CheckBox Content="{Binding Path=DisplayName}"
                  IsChecked="{Binding Path=IsChecked}" Margin="5 5 0 0"/>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
  <Button Grid.Row="1" Content="{Binding Path=ActionLabel}"
          Margin="10" Click="ActionButton_Click"/>
  <Button Grid.Row="1" Grid.Column="1" Content="Cancel"
          Margin="10" Click="CloseButton_Click"/>
</Grid>

1 个答案:

答案 0 :(得分:0)

您可以为Style中的ListBox定义Window.Resources。我不知道你的尝试是否引发了一些错误,但你真的可以携带Style所有常见属性。 必须使用ListBox的任何Style只需设置其Style属性。

这是一个可能的例子:

<Window.Resources>
  <Style TargetType="ListBox" x:Key="MyListBoxStyle">
    <Setter Property="HorizontalAlignment" Value="Stretch"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="Padding" Value="0,0,10,10"/>
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate>
          <Expander Header="{Binding Name}" IsExpanded="False">
            <ItemsPresenter />
          </Expander>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</Window.Resources>

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="*"/>
    <RowDefinition Height="*"/>
  </Grid.RowDefinitions>

  <ListBox Grid.Row="0" Name="LB1"
           ItemsSource="{Binding Path=Source1}"
           Style="{StaticResource ResourceKey=MyListBoxStyle}"/>

  <ListBox Grid.Row="1" Name="LB2"
           ItemsSource="{Binding Path=Source2}"
           Style="{StaticResource ResourceKey=MyListBoxStyle}"/>
</Grid>

我将ItemsSource属性从Style中删除了,因为我认为这两个ListBoxes有2个不同的来源,但是如果它们具有相同的来源,则可以添加SetterStyle这样的1}}:

<Setter Property="ItemsSource" Value="{Binding Path=MySingleSource}"/>