Не удается связать на радиообучении с помощью пользовательского управления

StackOverflow https://stackoverflow.com/questions/5381786

  •  28-10-2019
  •  | 
  •  

Вопрос

Я использовал пользовательский контроль 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 Product of the Radiobutton и кнопки ControlTemplate Toggle верно, когда я изучаю их значения. Эми, я делаю что -то не так с обязанностью? Любые идеи?

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

<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}"/>
Это было полезно?

Решение

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

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

Другие советы

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

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

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

РЕДАКТИРОВАТЬ:

В следующем примере показано, как это можно сделать. Вам просто нужно добавить ссылку на презентациюframework.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>

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top