Domanda

Ho usato un controllo radiobutton personalizzato con un modello di controllo come modello di controllo. Ecco come appare l'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 funzionato bene, tranne quando provo a impostare programmaticamente la proprietà di un pulsante o di fare un vincolo con esso. Quindi il pulsante che dovrebbe essere controllato non risponde visivamente - non sembra essere premuto e non appare l'effetto aerodinamico. Il gestore di eventi cliccata funziona ancora e la proprietà ischecked sia del radibutton che del pulsante di attivazione del controllo del controllo è vera quando esamino i loro valori. Amy sto facendo qualcosa di sbagliato con il vincolo? Qualche idea?

Ecco un esempio di come lo uso nell'applicazione:

<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}"/>
È stato utile?

Soluzione

Quindi il problema con il mio controllo di RadiotoggleButton personalizzato è stato causato da qualcosa di molto strano. Descriverò la mia soluzione di seguito, non perché mi aspetto che qualcun altro incontri questo particolare problema, ma proprio come un esempio di una soluzione che sembra non collegata al problema.

C'era una proprietà di rilegatura su ISenabled della boxbox contenente il gruppo di pulsanti. Questo legame sembrava funzionare bene, abilitando e disabilitando tutti i controlli interni quando appropriato. Ma non appena ho rimosso questo legame, il problema che ho descritto sopra è scomparso. Questo non è l'ideale, ma ho deciso di aver trascorso troppo tempo su questo tema, quindi ho legato le proprietà isenabili dei singoli controlli alla stessa proprietà a cui era stato legato il gruppo di gruppo, e ora almeno ho il comportamento i ricercato.

Altri suggerimenti

Quello che hai è molto strano. La classe Radibutton deriva da ToggleButton. Quindi effettivamente metti un pulsante in un pulsante. Stai semplicemente cercando di far sembrare il radiobutton come un tagglebutton? In tal caso, perché non usi direttamente ToggleButton?

Se si desidera rendere il radibutton come un ToggleButton in modo da poter utilizzare la funzione GroupName, dovresti copiare il modello di controllo ToggleButton e usarlo (non incorporare un ToggleButton nel modello di controllo).

Puoi ottenere i modelli predefiniti qui. Quindi cerca lo stile ToggleButton e copia il suo controllo.

MODIFICARE:

Il seguente esempio mostra come questo può essere fatto. Devi solo aggiungere un riferimento 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>

Se tutto quello che vuoi è un RadioButton che sembra un ToggleButton, puoi effettivamente fare implicitamente riferimento allo stile di ToggleButton come una risorsa statica per il suo tipo:

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

Questo sembra funzionare perché il radiobutton discende da ToggleButton. Quindi non puoi, ad esempio, usare {StaticResource {x:Type ComboBox}}.

Non sono in grado di rintracciare alcuna documentazione per l'utilizzo di un x:Type come risorsa per Style; Sarei interessato a vederlo, se qualcuno là fuori sa dove cercare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top