WPF复选框与多行内容对齐到左上角

时间:2015-03-30 18:13:39

标签: c# wpf checkbox

我有一个带有HierachicalDatatemplates的WPF Treeview用于节点。 子节点包含用于选择子节点的复选框。 到目前为止一切都很好。

子节点的内容应该是一个带有多行内容的复选框,几个文本框,并根据视图模型一些图片。

当我将内容放在复选框内时,该框始终显示在内容的垂直中心。 但我希望复选框位于内容的左上角。

以下是WPF代码示例:

<Window x:Class="Spielwiese.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">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <!--THIS IS WHAT I LIKE TO USE-->
    <CheckBox Grid.Column="0" Margin="5">
        <StackPanel>
            <TextBlock Text="Some text" />
            <TextBlock Text="Some more text" />
            <TextBlock Text="a lot of more text" />
        </StackPanel>
    </CheckBox>       


    <!--THIS IS MY ACTUAL WORKAROUND-->
    <Grid Grid.Column="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto" />
            <ColumnDefinition Width="auto" />
        </Grid.ColumnDefinitions>
        <CheckBox Grid.Column="0" Margin="0,3,5,0" />
        <StackPanel Grid.Column="1">
            <TextBlock Text="Some text" />
            <TextBlock Text="Some more text" />
            <TextBlock Text="a lot of more text" />
        </StackPanel>
    </Grid>
</Grid>

由于选择了节点,我希望内容位于checkbock中。 我已经尝试为checkbock设置verticalcontentalignment但它没有改变任何内容。

编辑: 填充是一种解决方案,但不幸的是,无论哪个内容,复选框的位置应始终位于左上角。内容的行可能会有所不同......

也许索蒙已经解决了这个小问题。

1 个答案:

答案 0 :(得分:2)

  

我希望内容在checkbo [x]中,因为   选择节点。

复选框控件使用ContentPresenter,其中(带复选框)主要用于处理基本文本方案。

  

因为选择了节点。

这是提供答案变得棘手的地方,因为现在要求必须在树视图的上下文(可以这么说)中工作。只有你能说出这些要求......但是......

选项

我认为你有这些选择:

  1. 创建一个自定义复合控件(可以在模板中使用),一个扩展的复选框控件,它基本上呈现就像你已经显示的网格工作一样以上。请注意,您可以将图像和内容绑定到自定义控件的内部,并显示依赖项属性,这些属性随后将被绑定。
  2. 在Blend中创建新的Checkbox样式,并取出包含其中包含所需内容的内容展示器。 (我在下面的例子中这样做了。)
  3. 没有快速的方法可以做到这一点......但是可以使用自定义控件(我的主要建议)或模板更改。

    新复选框样式

    原始ContentPresenter已被删除并替换为网格以保存复选框和文本。以下样式创建了这个:

    Checkbox styled result

    <Style x:Key="OmegaCheckBoxStyle" TargetType="{x:Type CheckBox}">
    <Setter Property="Foreground" 
            Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="Background" Value="{StaticResource CheckBoxFillNormal}"/>
    <Setter Property="BorderBrush" Value="{StaticResource CheckBoxStroke}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="FocusVisualStyle" Value="{StaticResource EmptyCheckBoxFocusVisual}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type CheckBox}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="auto" />
                    <ColumnDefinition Width="4" />
                    <ColumnDefinition Width="auto" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="auto"/>
    
                </Grid.RowDefinitions>
                    <BulletDecorator Background="Transparent" 
                                     SnapsToDevicePixels="true"  
                                     VerticalAlignment="Bottom">
                        <BulletDecorator.Bullet>
                             <Themes:BulletChrome BorderBrush="{TemplateBinding BorderBrush}" 
                                                Background="{TemplateBinding Background}" 
                                                IsChecked="{TemplateBinding IsChecked}" 
                                        RenderMouseOver="{TemplateBinding IsMouseOver}" 
                                                RenderPressed="{TemplateBinding IsPressed}"
                                                    />
                        </BulletDecorator.Bullet>
                    </BulletDecorator>
    
                    <TextBlock Text="Some text"  Grid.Row="0" Grid.Column="2"/>
                    <TextBlock Text="Some more text" Grid.Row="1" Grid.Column="2"/>
                    <TextBlock Text="a lot of more text" Grid.Row="2" Grid.Column="2"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasContent" Value="true">
                        <Setter Property="FocusVisualStyle" 
                                Value="{StaticResource CheckRadioFocusVisual}"/>
                        <Setter Property="Padding" Value="4,0,0,0"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" 
                                Value="{DynamicResource {x:Static 
                                                         SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>            
    </Setter>