9

テキスト ボックスといくつかのスタイルを持つボタンを含むデータ テンプレートがあります。フォーカスがその横のテキストボックスにあるときに、マウスオーバー状態をボタンに表示したいと思います。これは可能ですか?

このような内容になると思います。FindVisualChild と FindName を使用してテキスト ボックスを取得できます。次に、テキスト ボックスに GotFocus イベントを設定して何かを行うことができます。

_myTextBox.GotFocus += new RoutedEventHandler(TB_GotFocus);

ここ TB_GotFocus で行き詰まっています。マウスオーバー状態を表示したいボタンを取得できますが、それに送信するイベントがわかりません。MouseEnterEvent は許可されていません。

void TB_GotFocus(object sender, RoutedEventArgs e)
  {
     ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(this.DataTemplateInstance);
     DataTemplate template = myContentPresenter.ContentTemplate;

     Button _button= template.FindName("TemplateButton", myContentPresenter) as Button;
     _button.RaiseEvent(new RoutedEventArgs(Button.MouseEnterEvent));

  } 
4

2 に答える 2

0

jesperll のコメントのフォローアップとして、スタイルを必要な/null に動的に設定することで、テーマごとにカスタム テンプレートを作成することを回避できると思います。

これが私のウィンドウで、スタイルが定義されています (ただし、何も設定されていません)。

<Window x:Class="WpfApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication"
Title="Window1" Height="300" Width="300">

<Window.Resources>
    <Style TargetType="{x:Type Button}" x:Key="MouseOverStyle">
        <Setter Property="Background">
            <Setter.Value>Green</Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid Height="30">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="3*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBox x:Name="MyTextBox" Grid.Column="0" Text="Some Text" Margin="2" GotFocus="TextBox_GotFocus" LostFocus="MyTextBox_LostFocus"/>
    <Button x:Name="MyButton" Grid.Column="1" Content="Button" Margin="2" MouseEnter="Button_MouseEnter" MouseLeave="Button_MouseLeave" />
</Grid>

テンプレートでトリガーを介してスタイルを設定する代わりに、次のように .cs ファイルでイベントを使用できます。

...

    public partial class Window1 : Window
{
    Style mouseOverStyle;
    public Window1()
    {
        InitializeComponent();
        mouseOverStyle = (Style)FindResource("MouseOverStyle");
    }
    private void TextBox_GotFocus(object sender, RoutedEventArgs e) { MyButton.Style = mouseOverStyle; }
    private void MyTextBox_LostFocus(object sender, RoutedEventArgs e) { MyButton.Style = null; }
    private void Button_MouseEnter(object sender, MouseEventArgs e) { ((Button)sender).Style = mouseOverStyle; }
    private void Button_MouseLeave(object sender, MouseEventArgs e) { ((Button)sender).Style = null; }
}

コンストラクターでスタイルへの参照を取得し、動的に設定/設定解除します。このように、スタイルを Xaml でどのように表示するかを定義でき、新しい依存関係に依存する必要はありません。

于 2009-01-26T15:21:15.003 に答える