【问题标题】:Selection broken in custom RadioButton control template自定义 RadioButton 控件模板中的选择损坏
【发布时间】:2013-12-03 14:56:48
【问题描述】:

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

<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。那么这里发生了什么,我怎样才能让我的示例正常工作?

【问题讨论】:

    标签: silverlight xaml radio-button controltemplate


    【解决方案1】:

    你会认为控件模板中可能有一个命名部分

    是的……事实证明有一个“未记录的功能”。反复试验表明“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>
    

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 2014-04-04
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      相关资源
      最近更新 更多