Не удается связать IsChecked на RadioButton с помощью пользовательского ControlTemplate - PullRequest
2 голосов
/ 21 марта 2011

Я использовал пользовательский элемент управления RadioButton с ToggleButton в качестве шаблона элемента управления. Вот как выглядит 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>

Работает хорошо, за исключением случаев, когда я пытаюсь либо программно установить свойство IsChecked кнопки, либо связать его с ним. Тогда кнопка, которая должна быть проверена, визуально не отвечает - она, кажется, не нажата, и эффект наведения мыши Aero не появляется. Обработчик события Clicked по-прежнему работает, и свойство IsChecked как RadioButton, так и кнопки переключения ControlTemplate имеют значение true, когда я проверяю их значения. Эми, я делаю что-то не так с привязкой? Есть идеи?

Вот пример того, как я использую его в приложении:

<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}"/>

Ответы [ 3 ]

1 голос
/ 11 января 2016

Если все, что вам нужно, это RadioButton, который выглядит как ToggleButton, вы можете неявно ссылаться на стиль ToggleButton как статический ресурс по его типу:

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

Кажется, это работает, потому что RadioButton происходит от ToggleButton. Так что вы не можете, например, использовать {StaticResource {x:Type ComboBox}}.

Я не могу отследить какую-либо документацию для использования x:Type в качестве ресурса для Style; Мне было бы интересно увидеть это, если кто-нибудь там знает, где искать.

1 голос
/ 21 марта 2011

То, что у вас есть, очень странно. Класс RadioButton является производным от ToggleButton. Таким образом, вы положили кнопку в кнопку. Вы просто пытаетесь сделать RadioButton похожим на ToggleButton? Если это так, почему бы вам не использовать ToggleButton напрямую?

Если вы хотите, чтобы RadioButton выглядел как ToggleButton, чтобы вы могли использовать функцию GroupName, вам нужно будет скопировать шаблон элемента управления ToggleButton и использовать его (не встраивая ToggleButton в шаблон элемента управления).

Вы можете получить шаблоны по умолчанию от здесь . Затем найдите стиль ToggleButton и скопируйте его ControlTemplate.

EDIT:

Следующий пример показывает, как это можно сделать. Вам просто нужно добавить ссылку на 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>
0 голосов
/ 23 марта 2011

Итак, проблема с моим пользовательским элементом управления RadioToggleButton была вызвана чем-то очень странным.Я опишу свое решение ниже не потому, что я ожидаю, что кто-то другой столкнется с этой конкретной проблемой, а просто в качестве примера решения, которое кажется не связанным с этой проблемой.

Была привязка свойства IsEnabled объектаGroupBox, содержащий группу кнопок.Эта привязка, кажется, работала нормально, включая и отключая все внутренние элементы управления, когда это необходимо.Но как только я удалил эту привязку, описанная выше проблема исчезла.Это не идеально, но я решил, что потратил слишком много времени на эту проблему, поэтому я связал свойства IsEnabled отдельных элементов управления с тем же свойством, с которым был связан GroupBox, и теперь, по крайней мере, у меня есть поведение, которое яхотел.

...