如何将CheckBox ControlTemplate更改为另一个形状,同时保持" Checked"和"未经检查"可见?

时间:2012-03-06 10:13:50

标签: c# .net wpf controltemplate

我需要让CheckBox看起来像一个“(”形状而不是它的正方形形状,“(”形状应该在其中有一些空间,以便用户在检查时观察差异取消选中。 提前致谢

2 个答案:

答案 0 :(得分:1)

您需要在comboBox样式中更改模板。这是一个圆形复选框的示例:

   <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="CheckBox">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CheckStates">
                            <VisualState x:Name="Unchecked"/>
                            <VisualState x:Name="Checked">
                                <Storyboard>
                                    <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="tick" />
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Indeterminate"/>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Ellipse x:Name="blackframe" Stroke="Black" Fill="Blue" Width="16" Height="16"/>
                    <Ellipse x:Name="background" Margin="2" Fill="AliceBlue" Width="12" Height="12"/>
                    <ContentPresenter x:Name="contentPresenter" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="1" Margin="5,0,0,0"/>
                    <Path x:Name="tick" Fill="Black" Data="F1 M 4.325,7.852 C 4.175,7.852 4.026,7.807 3.900,7.720 L 0.325,5.262 C -0.016,5.027 -0.103,4.560 0.132,4.219 C 0.367,3.877 0.833,3.792 1.175,4.025 L 4.091,6.030 L 7.478,0.365 C 7.690,0.010 8.151,-0.107 8.506,0.106 C 8.861,0.319 8.978,0.779 8.765,1.135 L 4.969,7.486 C 4.863,7.664 4.688,7.790 4.485,7.834 C 4.432,7.846 4.378,7.852 4.325,7.852 L 4.325,7.852 Z" HorizontalAlignment="Center" VerticalAlignment="Center" Opacity="0"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

如果要更改形状,则需要创建路径而不是椭圆。 Blend可能是最好的选择。

答案 1 :(得分:1)

当您更改控件的模板时,您基本上会更改其可视树。 在这种情况下,您将丢失本机Windows控件中提供的状态的可视化。 例如,如果您更改按钮的模板,首先您点击它时看不到任何事情。

如果您使用Dot.Net 4,您可以使用VisualState(推荐方法),例如在emybob的代码中

如果您使用Dot.Net 3.5,则无法使用VisualState,但可以使用ControTemplate.Triggers http://msdn.microsoft.com/en-us/library/system.windows.controls.controltemplate.triggers.aspx