none
ボタンなどのコントロールの枠線だけ消したい(by XP) RRS feed

  • 質問

  • お世話になっております。

    昨日質問させていただきました。

    http://social.msdn.microsoft.com/Forums/ja-JP/wpfja/thread/bf89c7d4-f4a7-404d-8ca5-56cd6f8b00bc

    vistaや7はこれで良いと思いますが、XPだと枠線が消えません。

    どうしたら消えますでしょうか?

    2012年12月14日 0:21

回答

  • 既定のテンプレートを元に、ControlTemplateを再定義してやると可能です。めんどくさいですけどね・・・

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Button Content="枠を非表示" Height="30" Width="100" HorizontalAlignment="Left" 
                    Margin="50,50,0,0" VerticalAlignment="Top" BorderBrush="{x:Null}" />
            
            <Button Content="枠を表示" Height="30" Width="100" HorizontalAlignment="Left" 
                    Margin="180,50,0,0" VerticalAlignment="Top" />
            
            <Button Content="枠を非表示2" Height="30" Width="100" HorizontalAlignment="Left" 
                    Margin="310,50,0,0" VerticalAlignment="Top" Background="Transparent" >
                <Button.Template>
                    <ControlTemplate TargetType="ButtonBase" 
                                     xmlns:s="clr-namespace:System;assembly=mscorlib" 
                                     xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
                        <mwt:ButtonChrome Background="{TemplateBinding Panel.Background}" 
                                          RenderDefaulted="{TemplateBinding Button.IsDefaulted}" 
                                          RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" 
                                          RenderPressed="{TemplateBinding ButtonBase.IsPressed}" 
                                          Name="Chrome" 
                                          SnapsToDevicePixels="True">
                            <ContentPresenter RecognizesAccessKey="True" 
                                              Content="{TemplateBinding ContentControl.Content}" 
                                              ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" 
                                              ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" 
                                              Margin="{TemplateBinding Control.Padding}" 
                                              HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
                                              VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" 
                                              SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                        </mwt:ButtonChrome>
                        
                        <ControlTemplate.Triggers>
                            <Trigger Property="UIElement.IsKeyboardFocused">
                                <Setter TargetName="Chrome" Property="mwt:ButtonChrome.RenderDefaulted">
                                    <Setter.Value>
                                        <s:Boolean>True</s:Boolean>
                                    </Setter.Value>
                                </Setter>
                                <Trigger.Value>
                                    <s:Boolean>True</s:Boolean>
                                </Trigger.Value>
                            </Trigger>
                            <Trigger Property="ToggleButton.IsChecked">
                                <Setter TargetName="Chrome" Property="mwt:ButtonChrome.RenderPressed">
                                    <Setter.Value>
                                        <s:Boolean>True</s:Boolean>
                                    </Setter.Value>
                                </Setter>
                                <Trigger.Value>
                                    <s:Boolean>True</s:Boolean>
                                </Trigger.Value>
                            </Trigger>
                            <Trigger Property="UIElement.IsEnabled">
                                <Setter Property="TextElement.Foreground">
                                    <Setter.Value>
                                        <SolidColorBrush>#FFADADAD</SolidColorBrush>
                                    </Setter.Value>
                                </Setter>
                                <Trigger.Value>
                                    <s:Boolean>False</s:Boolean>
                                </Trigger.Value>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Button.Template>
            </Button>
        </Grid>
    </Window>
    

    上記の例はマウスカーソルを重ねた時の挙動とかはそのままになってます。必要無ければRenderMouseOverやRenderPressedの定義を削除すればエフェクトも無くなります。
    (というか単にクリックを拾うだけならButtonChromeをBorderに変えてしまえば良いと思いますが)。

    以上、参考になれば幸いです。

    • 回答としてマーク sumi_sumi 2012年12月16日 6:54
    2012年12月14日 10:42
  • エラーメッセージにある通りです。
    『PresentationFramework.Aero』を参照設定に追加するようにして下さい。

    2012年12月15日 11:55

すべての返信

  • XP でも前のスレッドの方法で枠線が非表示になりますが、これではダメなんでしょうか?

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="150" Width="350">
        <Grid>
            <Button Content="枠を非表示" Height="30" Width="100" HorizontalAlignment="Left" 
                    Margin="50,50,0,0" VerticalAlignment="Top" BorderBrush="{x:Null}" />
            <Button Content="枠を表示" Height="30" Width="100" HorizontalAlignment="Left" 
                    Margin="180,50,0,0" VerticalAlignment="Top" />
        </Grid>
    </Window>


    ひらぽん http://d.hatena.ne.jp/hilapon/


    2012年12月14日 5:18
    モデレータ
  • ついでですが

    BorderBrush="#00000000"

    でもいいし、

    BorderBrush="{x:Null}"

    でも結果は同じです。(透明にするか、ヌルにするかの違いだけ)


    ひらぽん http://d.hatena.ne.jp/hilapon/

    2012年12月14日 5:23
    モデレータ
  • ひらぽんさま

    影のようにうっすら線が見えてますよね?これでは、駄目なんです。

    Vistaや7のように完全には消えていません。

    2012年12月14日 9:07
  • 既定のテンプレートを元に、ControlTemplateを再定義してやると可能です。めんどくさいですけどね・・・

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Button Content="枠を非表示" Height="30" Width="100" HorizontalAlignment="Left" 
                    Margin="50,50,0,0" VerticalAlignment="Top" BorderBrush="{x:Null}" />
            
            <Button Content="枠を表示" Height="30" Width="100" HorizontalAlignment="Left" 
                    Margin="180,50,0,0" VerticalAlignment="Top" />
            
            <Button Content="枠を非表示2" Height="30" Width="100" HorizontalAlignment="Left" 
                    Margin="310,50,0,0" VerticalAlignment="Top" Background="Transparent" >
                <Button.Template>
                    <ControlTemplate TargetType="ButtonBase" 
                                     xmlns:s="clr-namespace:System;assembly=mscorlib" 
                                     xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
                        <mwt:ButtonChrome Background="{TemplateBinding Panel.Background}" 
                                          RenderDefaulted="{TemplateBinding Button.IsDefaulted}" 
                                          RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" 
                                          RenderPressed="{TemplateBinding ButtonBase.IsPressed}" 
                                          Name="Chrome" 
                                          SnapsToDevicePixels="True">
                            <ContentPresenter RecognizesAccessKey="True" 
                                              Content="{TemplateBinding ContentControl.Content}" 
                                              ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" 
                                              ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" 
                                              Margin="{TemplateBinding Control.Padding}" 
                                              HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
                                              VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" 
                                              SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                        </mwt:ButtonChrome>
                        
                        <ControlTemplate.Triggers>
                            <Trigger Property="UIElement.IsKeyboardFocused">
                                <Setter TargetName="Chrome" Property="mwt:ButtonChrome.RenderDefaulted">
                                    <Setter.Value>
                                        <s:Boolean>True</s:Boolean>
                                    </Setter.Value>
                                </Setter>
                                <Trigger.Value>
                                    <s:Boolean>True</s:Boolean>
                                </Trigger.Value>
                            </Trigger>
                            <Trigger Property="ToggleButton.IsChecked">
                                <Setter TargetName="Chrome" Property="mwt:ButtonChrome.RenderPressed">
                                    <Setter.Value>
                                        <s:Boolean>True</s:Boolean>
                                    </Setter.Value>
                                </Setter>
                                <Trigger.Value>
                                    <s:Boolean>True</s:Boolean>
                                </Trigger.Value>
                            </Trigger>
                            <Trigger Property="UIElement.IsEnabled">
                                <Setter Property="TextElement.Foreground">
                                    <Setter.Value>
                                        <SolidColorBrush>#FFADADAD</SolidColorBrush>
                                    </Setter.Value>
                                </Setter>
                                <Trigger.Value>
                                    <s:Boolean>False</s:Boolean>
                                </Trigger.Value>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Button.Template>
            </Button>
        </Grid>
    </Window>
    

    上記の例はマウスカーソルを重ねた時の挙動とかはそのままになってます。必要無ければRenderMouseOverやRenderPressedの定義を削除すればエフェクトも無くなります。
    (というか単にクリックを拾うだけならButtonChromeをBorderに変えてしまえば良いと思いますが)。

    以上、参考になれば幸いです。

    • 回答としてマーク sumi_sumi 2012年12月16日 6:54
    2012年12月14日 10:42
  • みっとさま

    有難う御座います。

    サンプルソースがコンパイルエラーになってしまいました。

    エラー    1    タグ 'ButtonChrome' は、XML 名前空間 'clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero' にありません。 行 18 位置 22.    C:\Documents and Settings\USER\デスクトップ\WpfApplication1\WpfApplication1\Window1.xaml    18    22    WpfApplication1

    環境は、Windows XP SP3、Visual Studio 2008です。

    2012年12月15日 8:02
  • エラーメッセージにある通りです。
    『PresentationFramework.Aero』を参照設定に追加するようにして下さい。

    2012年12月15日 11:55
  • みっとさま

    有難う御座います。

    ネットで検索して見つけたPresentationFramework.dllを入れてましたが駄目でした(^^;)

    今度は、

    C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationFramework.dll

    を入れたらコンパイルエラーなく通りました。

    ちゃんと綺麗に枠線が消えていました。

    有難う御座います。

    ただ、本当に面倒くさいですね・・・orz

    2012年12月16日 6:54