none
RibbonRadioButtonのCheckedBackgroundブラシに、余計なハイライトがつきます RRS feed

  • 質問

  • .NetFramework 4.5 WPFのRibbonコントロールについての質問です。

    RibbonRadioButtonのCheckedブラシを変更しようと、親のRibbonコントロールのCheckedBackground及びCheckedBorderブラシを変更したのですが、表題の通り橙色のハイライトが残っており、非常に見栄えの悪いものになってしまいます。

    このハイライトを個別に色指定したいと思ったのですが、該当箇所が見つかりませんでした。なんとかするにはスタイルで一からボタンを作り直すしかないのでしょうか?

    コードは以下となります。

    <RibbonWindow x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="WpfApplication1">
        <Grid>
            <Ribbon CheckedBorderBrush="Red" CheckedBackground="Red">
                <RibbonTab Header="ホーム">
                    <RibbonGroup Header="テスト">
                        <RibbonRadioButton Label="テスト" IsChecked="True"/>
                    </RibbonGroup>
                </RibbonTab>
            </Ribbon>
        </Grid>
    </RibbonWindow>

    以上、よろしくお願いします。

    2013年7月5日 8:30

回答

  • BorderThickness=0がまずいなら以下の手で、

    <Grid>
        <Grid.RenderTransform>
            <ScaleTransform ScaleX="3" ScaleY="3" />
        </Grid.RenderTransform>
        <Ribbon >
            <RibbonTab Header="ホーム">
                <RibbonGroup Header="テスト">
                    <RibbonRadioButton Label="テスト" />
                    <RibbonRadioButton Label="テスト" CheckedBorderBrush="Red" CheckedBackground="Red"/>
                    <RibbonRadioButton Label="テスト" CheckedBorderBrush="Red" CheckedBackground="Red"
                        Loaded="RibbonRadioButton_Loaded"/>
                </RibbonGroup>
            </RibbonTab>
        </Ribbon>
    </Grid>

    VB.Net

    'Imports System.Windows.Controls.Ribbon
    Private Sub RibbonRadioButton_Loaded(sender As Object, e As RoutedEventArgs)
        Dim radio As RadioButton = CType(sender, RibbonRadioButton)
        Dim innerBorder As Border = radio.Template.FindName("InnerBorder", radio)
        Dim outerBorder As Border = radio.Template.FindName("OuterBorder", radio)
        If (innerBorder IsNot Nothing AndAlso outerBorder IsNot Nothing) Then
            Dim bnd As Binding = New Binding("BorderBrush")
            bnd.Source = outerBorder
            BindingOperations.SetBinding(innerBorder, Border.BorderBrushProperty, bnd)
        End If
    End Sub

    C#

    //using System.Windows.Controls.Ribbon;
    private void RibbonRadioButton_Loaded(object sender, RoutedEventArgs e)
    {
        RadioButton radio=(RibbonRadioButton)sender;
        Border innerBorder=radio.Template.FindName("InnerBorder",radio) as Border;
        Border outerBorder=radio.Template.FindName("OuterBorder",radio) as Border;
        if (innerBorder != null && outerBorder != null)
        {
            Binding bnd = new Binding("BorderBrush");
            bnd.Source = outerBorder;
            BindingOperations.SetBinding(innerBorder, Border.BorderBrushProperty, bnd);
        }
    }
    状況に応じてinnerBorderのBorderBrushを書き換えるのが面倒なので、outerBorderの変化と同じになるようにBindingしてみました。
    他の色にしたければ、状況に応じて色を設定してやってください。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2013年7月7日 6:35

すべての返信

  • こんな?

    <RibbonRadioButton Label="テスト" IsChecked="True" CheckedBorderBrush="Red" CheckedBackground="Red" BorderThickness="0">
    SnoopでみるとInnerBorderという名前のBorderのBorderBrushが残っているみたいですね。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2013年7月5日 11:05
  • 回答ありがとうございます。

    なるほど、BorderThicknessを0にすると消えるんですね。ただ、サンプルではBorderとBackgroundを同色にしましたが実際に使用するときは別の色を使っているので、Borderも消えてしまうやり方は問題が…。不適切なサンプルですいません。

    snoopでスタイルの中身が見れるんですね。自分も調べてみます。ありがとうございました。


    • 編集済み 紫葉 2013年7月5日 13:05 文言の修正
    2013年7月5日 13:04
  • BorderThickness=0がまずいなら以下の手で、

    <Grid>
        <Grid.RenderTransform>
            <ScaleTransform ScaleX="3" ScaleY="3" />
        </Grid.RenderTransform>
        <Ribbon >
            <RibbonTab Header="ホーム">
                <RibbonGroup Header="テスト">
                    <RibbonRadioButton Label="テスト" />
                    <RibbonRadioButton Label="テスト" CheckedBorderBrush="Red" CheckedBackground="Red"/>
                    <RibbonRadioButton Label="テスト" CheckedBorderBrush="Red" CheckedBackground="Red"
                        Loaded="RibbonRadioButton_Loaded"/>
                </RibbonGroup>
            </RibbonTab>
        </Ribbon>
    </Grid>

    VB.Net

    'Imports System.Windows.Controls.Ribbon
    Private Sub RibbonRadioButton_Loaded(sender As Object, e As RoutedEventArgs)
        Dim radio As RadioButton = CType(sender, RibbonRadioButton)
        Dim innerBorder As Border = radio.Template.FindName("InnerBorder", radio)
        Dim outerBorder As Border = radio.Template.FindName("OuterBorder", radio)
        If (innerBorder IsNot Nothing AndAlso outerBorder IsNot Nothing) Then
            Dim bnd As Binding = New Binding("BorderBrush")
            bnd.Source = outerBorder
            BindingOperations.SetBinding(innerBorder, Border.BorderBrushProperty, bnd)
        End If
    End Sub

    C#

    //using System.Windows.Controls.Ribbon;
    private void RibbonRadioButton_Loaded(object sender, RoutedEventArgs e)
    {
        RadioButton radio=(RibbonRadioButton)sender;
        Border innerBorder=radio.Template.FindName("InnerBorder",radio) as Border;
        Border outerBorder=radio.Template.FindName("OuterBorder",radio) as Border;
        if (innerBorder != null && outerBorder != null)
        {
            Binding bnd = new Binding("BorderBrush");
            bnd.Source = outerBorder;
            BindingOperations.SetBinding(innerBorder, Border.BorderBrushProperty, bnd);
        }
    }
    状況に応じてinnerBorderのBorderBrushを書き換えるのが面倒なので、outerBorderの変化と同じになるようにBindingしてみました。
    他の色にしたければ、状況に応じて色を設定してやってください。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2013年7月7日 6:35
  • ソースも記載いただき、丁寧な解説ありがとうございます。リソースで色を定義し、FindResourceでボーダーの色を指定してやろうと思います。

    大変勉強になりました。ありがとうございました。


    • 編集済み 紫葉 2013年7月8日 16:10 文言の修正
    2013年7月8日 16:09