我正在尝试为每个项目使用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。那么这里发生了什么,我怎样才能让我的例子工作?
答案 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>