WPF 边框和 Header 对齐
WPF Border and Header alignment
我的 XAML 代码中有两个问题。
<Grid Margin="20">
<ListBox x:Name="lbChampToSelect" ItemsSource="{Binding Lst}" HorizontalContentAlignment="Stretch" Grid.IsSharedSizeScope="True">
<Border Background="FloralWhite" BorderBrush="Silver" BorderThickness="1" CornerRadius="3,3,3,3">
<ListBox.Template>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Grid Margin="5,2" DockPanel.Dock="Top" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" SharedSizeGroup="Col1"></ColumnDefinition>
<ColumnDefinition Width="100" SharedSizeGroup="Col1"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Grid.Column="0">Libellé</Label>
<CheckBox IsChecked="False" Grid.Column="1"/>
</Grid>
<ItemsPresenter></ItemsPresenter>
</DockPanel>
</ControlTemplate>
</ListBox.Template>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="5,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" SharedSizeGroup="Col1"/>
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<TextBlock Margin="0,0,10,0" Text="{Binding Libelle }" Grid.Column="0" />
<CheckBox IsChecked="False" Grid.Column="1"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</Border>
</ListBox>
</Grid>
首先:无论我尝试什么,我都无法对齐 header 和包含复选框的列(带有标记复选框的文本是值得的)。最后,header 复选框应该选中所有后续项。
其次:我只是尝试在包括 header 在内的整个列表框上添加边框,但我收到 xaml 错误,指出成员模板不可访问或不存在。
感谢您的回答。
我将从第二个问题开始:
你的 Border 应该在 ControlTemplate 中(假设我猜对了你想要的样子)。
<ControlTemplate>
<Border Background="FloralWhite" BorderBrush="Silver" BorderThickness="1" CornerRadius="3,3,3,3">
现在回答第一个问题:有很多因素会影响 ListBox 中项目的布局。这是我用来解决问题的方法。
- 从您的网格中删除边距,我会将它们设置为 0,至少现在是这样。当您知道什么会影响什么时,您可以稍后添加布局。
- 下载Snoop
启动您的应用程序并开始窥探它
在层次结构中找到您的控件,然后尝试修改 margin/padding 值。这样你就会看到影响布局的因素。
- 在代码中应用新值。
否则,通过使用 ListView,您可以获得 header 个项目:
<ListView Margin="10" x:Name="lbChampToSelect" ItemsSource="{Binding Lst}" HorizontalContentAlignment="Stretch" Grid.IsSharedSizeScope="True" BorderBrush="Silver"
BorderThickness="1">
<ListView.Resources>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
<Style TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</ListView.Resources>
<ListView.View>
<GridView>
<GridViewColumn Header="Libelle" Width="120" DisplayMemberBinding="{Binding Libelle}" />
<GridViewColumn Width="50">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{ Binding IsChecked}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
<GridViewColumn.Header>
<CheckBox/>
</GridViewColumn.Header>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
我的 XAML 代码中有两个问题。
<Grid Margin="20">
<ListBox x:Name="lbChampToSelect" ItemsSource="{Binding Lst}" HorizontalContentAlignment="Stretch" Grid.IsSharedSizeScope="True">
<Border Background="FloralWhite" BorderBrush="Silver" BorderThickness="1" CornerRadius="3,3,3,3">
<ListBox.Template>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Grid Margin="5,2" DockPanel.Dock="Top" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" SharedSizeGroup="Col1"></ColumnDefinition>
<ColumnDefinition Width="100" SharedSizeGroup="Col1"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Grid.Column="0">Libellé</Label>
<CheckBox IsChecked="False" Grid.Column="1"/>
</Grid>
<ItemsPresenter></ItemsPresenter>
</DockPanel>
</ControlTemplate>
</ListBox.Template>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="5,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" SharedSizeGroup="Col1"/>
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<TextBlock Margin="0,0,10,0" Text="{Binding Libelle }" Grid.Column="0" />
<CheckBox IsChecked="False" Grid.Column="1"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</Border>
</ListBox>
</Grid>
首先:无论我尝试什么,我都无法对齐 header 和包含复选框的列(带有标记复选框的文本是值得的)。最后,header 复选框应该选中所有后续项。
其次:我只是尝试在包括 header 在内的整个列表框上添加边框,但我收到 xaml 错误,指出成员模板不可访问或不存在。
感谢您的回答。
我将从第二个问题开始:
你的 Border 应该在 ControlTemplate 中(假设我猜对了你想要的样子)。
<ControlTemplate>
<Border Background="FloralWhite" BorderBrush="Silver" BorderThickness="1" CornerRadius="3,3,3,3">
现在回答第一个问题:有很多因素会影响 ListBox 中项目的布局。这是我用来解决问题的方法。
- 从您的网格中删除边距,我会将它们设置为 0,至少现在是这样。当您知道什么会影响什么时,您可以稍后添加布局。
- 下载Snoop
启动您的应用程序并开始窥探它
在层次结构中找到您的控件,然后尝试修改 margin/padding 值。这样你就会看到影响布局的因素。
- 在代码中应用新值。
否则,通过使用 ListView,您可以获得 header 个项目:
<ListView Margin="10" x:Name="lbChampToSelect" ItemsSource="{Binding Lst}" HorizontalContentAlignment="Stretch" Grid.IsSharedSizeScope="True" BorderBrush="Silver"
BorderThickness="1">
<ListView.Resources>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
<Style TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</ListView.Resources>
<ListView.View>
<GridView>
<GridViewColumn Header="Libelle" Width="120" DisplayMemberBinding="{Binding Libelle}" />
<GridViewColumn Width="50">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{ Binding IsChecked}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
<GridViewColumn.Header>
<CheckBox/>
</GridViewColumn.Header>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>