36232


プログラム、スタック・オーバーフロー共に初心者です。  
記述するべき内容が不足していたら申し訳ありません。  
どんどんマサカリを投げていただけるとありがたいです。

## 環境

・Microsoft Visual Studio 2013 Express for Windows  
・.NET Framework 4.5.1  
・C# 5.0

* * *

## 現在の動き

xamlで、IconつきButtonとHyperlinkつきTextboxをStackpanelで並べています。  
Textboxはマウスカーソルが乗るとテキストに下線が表示され、  
マウスカーソルが外れると下線が消えるようにしています。

## やりたい事

Buttonにマウスカーソルが乗ると右にあるテキストに下線を表示し、  
マウスカーソルが外れると下線が消えるようにしたいです。

* * *

## ソース

・xaml  

[code]

        <UserControl.Resources>
            <ResourceDictionary>
                <Style TargetType="TextBlock" BasedOn="{StaticResource DefaultDialogTextStyleKey}">
                    <Setter Property="Margin" Value="10,0,0,0"/>
                </Style>
    
                <Style TargetType="TextBox" BasedOn="{StaticResource DefaultTextBoxStyleKey}"/>
                <Style TargetType="Button" BasedOn="{StaticResource DialogButtonStyle}">
                    <Setter Property="Height" Value="32"/>
                    <Setter Property="Width" Value="32"/>
                    <Setter Property="Margin" Value="0,2,0,2"/>
                </Style>
    
                <Style x:Key="BaseStackPanel" TargetType="StackPanel">
                    <Setter Property="Orientation" Value="Horizontal"/>
                </Style>
    
                <Style TargetType="Hyperlink">
                    <Setter Property="TextDecorations" Value="None"/>
                </Style>
            </ResourceDictionary>
        </UserControl.Resources>
    
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
    
            <Grid Grid.Column="0" Grid.Row="1" Margin="10,0,0,10">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
    
                <StackPanel Grid.Row="0" Grid.Column="0">
                    <StackPanel Style="{StaticResource BaseStackPanel}">
                        <Button Command="{Binding ListViewCommand}">
                            <Image Source="{StaticResource Icon}"/>
                        </Button>
                        <TextBlock Width="120">
                            <Hyperlink Command="{Binding ListViewCommand}"
                                       MouseEnter="OnMouseEnter" MouseLeave="OnMouseLeave">
                                       Test
                            </Hyperlink>
                        </TextBlock>
                        <TextBlock Text="テストです。"/>
                    </StackPanel>
                </StackPanel>
                <!--以下同じようなスタックパネルが数個続く-->
            </Grid>
        </Grid>
    </UserControl>
    
[/code]

・C#

[code]

     public MasterRegisterView()
    {
        InitializeComponent();
    }
    
    private void OnMouseEnter(object sender, MouseEventArgs e)
    {
        var hLink = new Hyperlink();
        if (sender.GetType() == hLink.GetType())
        {
            hLink = (Hyperlink)sender;
            hLink.TextDecorations = TextDecorations.Underline;
    
            Mouse.OverrideCursor = Cursors.Hand;
            Mouse.UpdateCursor();
        }
    }
    
    private void OnMouseLeave(object sender, MouseEventArgs e)
    {
        var hLink = new Hyperlink();
        if (sender.GetType() == hLink.GetType())
        {
            hLink = (Hyperlink)sender;
            hLink.TextDecorations = null;
    
            Mouse.OverrideCursor = null;
            Mouse.UpdateCursor();
        }
    }
    
[/code]

* * *

何が実装可能なのか、何がスマートで理想的な記述方法なのかも分かりません。  
//最初に思いついた実装がタイトルの内容です。(ButtonのMouseEnterイベントでTextboxのMouseEnterイベントを起こす)  
//Button用のMouseEnterイベントをC#で実装する？  
//triggerを使う？  
//xamlだけで出来るのでしょうか？

簡単そうなのですが上手い実装方法が思いつかず、質問させていただきました。  
ネットで調べてもピンと来ず…頭が固いです。  
ご教授お願い致します。


CC BY-SA 3.0
2017-07-10T01:18:45.203
36230
2017-07-10T02:24:45.723
2017-07-10T02:21:12.633
5750
question
c# wpf xaml
MouseEnterイベントを別の場所で同時に起こす


`Hyperlink`の`Style`に`Button.IsMouseOver`のトリガーを指定するのが簡単だと思います。  

[code]

    <Button
        Name="b"> <!-- 名前を指定する -->
    </Button>
    <TextBlock
        Width="120">
        <Hyperlink>
            <!-- Styleを追加 -->
            <Hyperlink.Style>
                <Style
                    TargetType="Hyperlink">
                    <!-- 既定値 -->
                    <Setter
                        Property="TextDecorations"
                        Value="None" />
                    <Style.Triggers>
                        <DataTrigger
                                Binding="{Binding ElementName=b, Path=IsMouseOver}"
                            Value="True">
                            <!-- ボタンのマウスオーバー時のスタイル -->
                            <Setter
                                Property="TextDecorations"
                                Value="Underline" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Hyperlink.Style>
            Test
        </Hyperlink>
    </TextBlock>
    
[/code]

ただ上記のままだと`Hyperlink`自体のマウスオーバーが考慮されていませんので、`<Trigger Property="IsMouseOver"
Value="True">`もトリガーに追加すべきかと思います。


CC BY-SA 3.0
2017-07-10T02:14:05.133
36232
2017-07-10T02:24:45.723
2017-07-10T02:24:45.723
5750
5750
36230
answer