自定义RadioButton控件模板中的选择中断

时间:2013-11-19 21:05:09

标签: silverlight xaml radio-button controltemplate

我正在尝试为每个项目使用ToggleButton为Silverlight RadioButton创建一个控件模板。我遇到的问题是选择机制似乎被打破了。这是我正在使用的(简化)风格:

<Style TargetType="RadioButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="RadioButton">
                <Grid>
                    <ToggleButton x:Name="toggle" 
                                  IsChecked="{TemplateBinding IsChecked}">
                        <ContentPresenter x:Name="contentPresenter" />
                    </ToggleButton>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

测试只是无线电选择是否真正有效 - 例如,当你点击单选按钮时,下面的文本块没有显示正确的值:

<StackPanel>
    <RadioButton x:Name="radio1" GroupName="Test" Content="1" />
    <RadioButton x:Name="radio2" GroupName="Test" Content="2" />
    <TextBlock Text="{Binding ElementName=radio1,Path=IsChecked,StringFormat='Radio 1 checked: {0}'}" />
    <TextBlock Text="{Binding ElementName=radio2,Path=IsChecked,StringFormat='Radio 2 checked: {0}'}" />
</StackPanel>

您可能认为控件模板中可能存在命名部件,控件使用该部件来更新选择 - 但是,the docs indicate no named parts。那么这里发生了什么,我怎样才能让我的例子工作?

1 个答案:

答案 0 :(得分:0)

  

您可能会认为控件模板中可能存在命名部件

是的......事实证明存在“未记录的功能”。试验和错误显示“BoxMiddleLine”是控制选择的命名部分。因此,向控件模板添加具有该名称的可单击元素可以解决问题:

<Grid>
    <Border x:Name="BoxMiddleLine" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#0000" />
    <ToggleButton x:Name="toggle" 
                  IsChecked="{TemplateBinding IsChecked}"
                  IsHitTestVisible="False">
        <ContentPresenter x:Name="contentPresenter" />
    </ToggleButton>
</Grid>