2

コントロール テンプレートとして ToggleButton を持つカスタム RadioButton コントロールを使用しています。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 イベント ハンドラーは引き続き機能し、値を調べると、RadioButton と ControlTemplate のトグル ボタンの IsChecked プロパティはどちらも 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}"/>
4

3 に答える 3

1

あなたが持っているものは非常に奇妙です。RadioButtonクラスはToggleButtonから派生しています。つまり、効果的にボタンをボタンに配置します。RadioButtonをToggleButtonのように見せようとしているだけですか?もしそうなら、ToggleButtonを直接使用してみませんか?

GroupName機能を使用できるようにRadioButtonをToggleButtonのように見せたい場合は、ToggleButtonコントロールテンプレートをコピーして使用する必要があります(コントロールテンプレートにToggleButtonを埋め込まないでください)。

ここからデフォルトのテンプレートを入手できます。次に、ToggleButtonスタイルを検索し、そのControlTemplateをコピーします。

編集:

次の例は、これを行う方法を示しています。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>
于 2011-03-21T18:27:35.780 に答える
1

If all you want is a RadioButton which looks like a ToggleButton, you can actually implicitly refer to ToggleButton's style as a static resource by its type:

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

This seems to work because RadioButton is descended from ToggleButton. So you can't, for example, use {StaticResource {x:Type ComboBox}}.

I'm not able to track down any documentation for using an x:Type as a resource for Style; I'd be interested to see it, if anyone out there knows where to look.

于 2016-01-11T00:06:21.043 に答える
0

したがって、私のカスタム RadioToggleButton コントロールの問題は、非常に奇妙なことが原因でした。他の誰かがこの特定の問題に遭遇することを期待しているからではなく、問題に関連していないように見える解決策の例として、以下に私の解決策を説明します。

ボタン グループを含む GroupBox の IsEnabled プロパティにバインディングがありました。このバインドは正常に機能しているように見え、適切な場合にすべての内部コントロールを有効または無効にしました。しかし、このバインディングを削除するとすぐに、上記の問題は解消されました。これは理想的ではありませんが、この問題に時間を費やしすぎたと判断したため、個々のコントロールの IsEnabled プロパティを、GroupBox がバインドされていたのと同じプロパティにバインドしました。欲しかった。

于 2011-03-23T15:39:19.723 に答える