Pregunta

He estado usando un control de radiobutton personalizado con un ToggleButton como plantilla de control. Así es como se ve el XAML:

    <RadioButton.Template>
        <ControlTemplate>
            <ToggleButton x:Name="tb" IsChecked="{Binding IsChecked, Mode=TwoWay, 
                                RelativeSource={RelativeSource TemplatedParent}}" 
                                      Content="{TemplateBinding RadioButton.Content}"
                          PreviewMouseDown="tb_PreviewMouseDown">
            </ToggleButton>
        </ControlTemplate>
    </RadioButton.Template>

Ha funcionado bien, excepto cuando trato de configurar programáticamente la propiedad de un botón Ischecked, o hacer una vinculación con ella. Luego, el botón que debe verificarse no responde visualmente: no parece estar presionado y el efecto aerodinámico no aparece. El controlador de eventos haciendo clic en el evento todavía funciona, y la propiedad ISCHECKED tanto del Botón de RadioButton como del ControlTemplate son verdaderas cuando examino sus valores. Amy, ¿estoy haciendo algo mal con el atento? ¿Algunas ideas?

Aquí hay un ejemplo de cómo lo uso en la aplicación:

<local:RadioToggleButton Content="1Hr" GroupName="Interval" x:Name="oneHrBtn" 
IsChecked="{BindingPath=oneHrBtnIsChecked, Mode=TwoWay}" Margin="2 5 3 5" 
IsEnabled="{Binding Path=oneHrBtnIsEnabled, Mode=TwoWay}"/>
¿Fue útil?

Solución

Entonces, el problema con mi control personalizado de RadiotoggleButton fue causado por algo muy extraño. Describiré mi solución a continuación, no porque espero que alguien más se encuentre con este problema en particular, sino como un ejemplo de una solución que parece desconectada del problema.

Hubo una vinculación en la propiedad ISEnabled de la caja de grupos que contenía el grupo de botones. Este enlace parecía funcionar bien, habilitando y deshabilitando todos los controles internos cuando sea apropiado. Pero tan pronto como eliminé este enlace, el problema que describí anteriormente desapareció. Esto no es ideal, pero decidí que había pasado demasiado tiempo en este tema, por lo que encuentro las propiedades ISELABLADAS de los controles individuales a la misma propiedad a la que la caja de grupo había estado obligada, y ahora al menos tengo el comportamiento I querido.

Otros consejos

Lo que tienes es muy extraño. La clase RadioButton deriva de ToggleButton. Así que efectivamente pones un botón en un botón. ¿Simplemente estás tratando de hacer que el radiobutton parezca un mochila? Si es así, ¿por qué no usas ToggleButton directamente?

Si desea que el radiobutton se vea como un toggleButton para que pueda usar la función de nombre de grupo, entonces tendrá que copiar la plantilla de control de ToggleButton y usarla (no incrustar un toggleButton en la plantilla de control).

Puede obtener las plantillas predeterminadas de aquí. Luego busque el estilo ToggleButton y copie su ControlTemplate.

EDITAR:

El siguiente ejemplo muestra cómo se puede hacer esto. Solo necesita agregar una referencia a PresentationFramework.aero.

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>

        <LinearGradientBrush x:Key="ButtonNormalBackground" StartPoint="0,0" EndPoint="0,1">
            <LinearGradientBrush.GradientStops>
                <GradientStop Color="#F3F3F3" Offset="0" />
                <GradientStop Color="#EBEBEB" Offset="0.5" />
                <GradientStop Color="#DDDDDD" Offset="0.5" />
                <GradientStop Color="#CDCDCD" Offset="1" />
            </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
        <SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070" />

            <Style x:Key="ButtonFocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="2" StrokeThickness="1" Stroke="Black" StrokeDashArray="1 2" SnapsToDevicePixels="true" />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style x:Key="{x:Type RadioButton}" TargetType="{x:Type RadioButton}">
            <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}" />
            <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}" />
            <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}" />
            <Setter Property="BorderThickness" Value="1" />
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
            <Setter Property="HorizontalContentAlignment" Value="Center" />
            <Setter Property="VerticalContentAlignment" Value="Center" />
            <Setter Property="Padding" Value="1" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type RadioButton}">
                        <theme:ButtonChrome Name="Chrome" Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding Button.IsDefaulted}"
                                RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}"
                                SnapsToDevicePixels="true">
                            <ContentPresenter Margin="{TemplateBinding Padding}"
                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True"
                                    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </theme:ButtonChrome>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsKeyboardFocused" Value="true">
                                <Setter TargetName="Chrome" Property="RenderDefaulted" Value="true" />
                            </Trigger>
                            <Trigger Property="ToggleButton.IsChecked" Value="true">
                                <Setter TargetName="Chrome" Property="RenderPressed" Value="true" />
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="#ADADAD" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <StackPanel>
        <RadioButton GroupName="TestGroup">Option 1</RadioButton>
        <RadioButton GroupName="TestGroup">Option 2</RadioButton>
    </StackPanel>
</Window>

Si todo lo que quieres es un RadioButton que parece un ToggleButton, en realidad, puede referirse implícitamente al estilo de ToggleButton como un recurso estático por su tipo:

<RadioButton Style="{StaticResource {x:Type ToggleButton}}" />

Esto parece funcionar porque RadioButton desciende de ToggleButton. Entonces no puedes, por ejemplo, usar {StaticResource {x:Type ComboBox}}.

No puedo rastrear ninguna documentación para usar un x:Type Como recurso para Style; Me interesaría verlo, si alguien sabe dónde buscar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top