none
マウスで選択したときに4つの行動を行えるようなWPFを作りたい。

    質問

  • WPFについて質問があり投稿させて頂きます。

    WPFの勉強を始めてまだ数日なのですが、

    ある動作で困っており、質問掲示板を知り、質問をさせていただきます。

    行いたい動作とは、ボタン押し下、フォーカス、選択中、選択出来ない状態

    の4状態を表示出来るようにしたいのですが、上手くいきません。

    ControlTemplate.Triggersを使用して上記の行動をしたいのですが、どのように記述すればよろしいでしょうか?

    <ControlTemplate.Triggers>で行うまではわかり以下の方法を試しました。

    "IsMouseOver"  マウスオーバー

    "IsPressed" マウスでクリック

    "IsFocused" マウスで選択中

    "IsSelected" マウスで選択出来ない

    Trigger Propertyに記載する状態は上記4種類で間違えていませんでしょうか?

    選択出来ない状態になっているはずの"IsSelected"が正しく無いような気がします。

    言葉足らずで申し訳ございませんがよろしくお願いいたします。

    <style type="text/css">p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.5px Helvetica; color: #a31515; background-color: #000000} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.5px Helvetica; background-color: #000000} span.s1 {color: #0000ff} span.s2 {color: #a31515} span.s3 {color: #ff0000} </style>
    2019年1月21日 6:42

回答

  • こんな

    <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d"
            Title="MainWindow" Height="300" Width="300">
        <Grid>
            <Grid.Resources>
                <!-- なんのコントロールなのか書いてないので、しかたないからToggleButtonとみなす -->
                <ControlTemplate  TargetType="{x:Type ToggleButton}" x:Key="ToggleButtonTemplate">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                        <Grid Background="Transparent">
                            <Grid Background="{TemplateBinding Background}">
                                <Grid.RowDefinitions>
                                    <RowDefinition />
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                
                                <ContentPresenter Grid.Row="0" Content="{TemplateBinding Content}"
                                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
    
                                <TextBlock Grid.Row="1" x:Name="txb" />
                            </Grid>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <!-- 並び順の影響あり -->
    
                        <Trigger Property="IsFocused" Value="true">
                            <Setter TargetName="txb" Property="Text"  Value="フォーカス" />
                        </Trigger>
    
                        <Trigger Property="IsChecked"  Value="true">
                            <Setter TargetName="txb" Property="Text" Value="選択中" />
                        </Trigger>
    
                        <Trigger Property="IsEnabled"  Value="false">
                            <Setter TargetName="txb" Property="Text" Value="選択出来ない状態" />
                        </Trigger>
    
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter TargetName="txb" Property="Text" Value="マウスオーバー" />
                        </Trigger>
    
                        <Trigger Property="IsPressed" Value="true">
                            <Setter TargetName="txb" Property="Text" Value="ボタン押し下" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
    
                <Style TargetType="{x:Type ToggleButton}">
                    <Setter Property="Template" Value="{StaticResource ToggleButtonTemplate}" />
                </Style>
            </Grid.Resources>
    
            <UniformGrid Columns="2" Rows="2">
                <ToggleButton Width="100" Height="100" x:Name="button1" Content="ボタン1"/>
                <CheckBox IsChecked="{Binding ElementName=button1,Path=IsEnabled}" IsTabStop="False" VerticalAlignment="Center" HorizontalAlignment="Center"/>
    
                <ToggleButton Width="100" Height="100" x:Name="button2" Content="ボタン2"/>
                <CheckBox IsChecked="{Binding ElementName=button2,Path=IsEnabled}" IsTabStop="False" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            </UniformGrid>
        </Grid>
    </Window>


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

    2019年1月21日 12:36

すべての返信

  • こんな

    <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d"
            Title="MainWindow" Height="300" Width="300">
        <Grid>
            <Grid.Resources>
                <!-- なんのコントロールなのか書いてないので、しかたないからToggleButtonとみなす -->
                <ControlTemplate  TargetType="{x:Type ToggleButton}" x:Key="ToggleButtonTemplate">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                        <Grid Background="Transparent">
                            <Grid Background="{TemplateBinding Background}">
                                <Grid.RowDefinitions>
                                    <RowDefinition />
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                
                                <ContentPresenter Grid.Row="0" Content="{TemplateBinding Content}"
                                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
    
                                <TextBlock Grid.Row="1" x:Name="txb" />
                            </Grid>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <!-- 並び順の影響あり -->
    
                        <Trigger Property="IsFocused" Value="true">
                            <Setter TargetName="txb" Property="Text"  Value="フォーカス" />
                        </Trigger>
    
                        <Trigger Property="IsChecked"  Value="true">
                            <Setter TargetName="txb" Property="Text" Value="選択中" />
                        </Trigger>
    
                        <Trigger Property="IsEnabled"  Value="false">
                            <Setter TargetName="txb" Property="Text" Value="選択出来ない状態" />
                        </Trigger>
    
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter TargetName="txb" Property="Text" Value="マウスオーバー" />
                        </Trigger>
    
                        <Trigger Property="IsPressed" Value="true">
                            <Setter TargetName="txb" Property="Text" Value="ボタン押し下" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
    
                <Style TargetType="{x:Type ToggleButton}">
                    <Setter Property="Template" Value="{StaticResource ToggleButtonTemplate}" />
                </Style>
            </Grid.Resources>
    
            <UniformGrid Columns="2" Rows="2">
                <ToggleButton Width="100" Height="100" x:Name="button1" Content="ボタン1"/>
                <CheckBox IsChecked="{Binding ElementName=button1,Path=IsEnabled}" IsTabStop="False" VerticalAlignment="Center" HorizontalAlignment="Center"/>
    
                <ToggleButton Width="100" Height="100" x:Name="button2" Content="ボタン2"/>
                <CheckBox IsChecked="{Binding ElementName=button2,Path=IsEnabled}" IsTabStop="False" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            </UniformGrid>
        </Grid>
    </Window>


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

    2019年1月21日 12:36
  • gekka様

    ご回答頂きありがとうございます。

    ご指摘の通りtoggle buttonを使用して作成したかったのでまさに欲しいソースでした。

    ややこしい、質問をして申し訳ございませんでした。

    本当に助かりました。ありがとうございました。

    2019年1月21日 13:46