0

noob の可能性のある質問で申し訳ありません。私は C# と WPF にまったく慣れていません。

いくつかのコントロールを含むウィンドウを作成しました。それらのすべてにツールチップが記入されています。ウィンドウの下部に専用の領域 (TextBlock) を用意して、ツールヒントのバロンの代わりにこれらのヒントを表示したいと考えています。私はすでにこれに対する解決策を見てきました。

public partial class MyWindow : Window
{
    public MyWindow()
    {
        InitializeComponent();

        EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.MouseEnterEvent, new MouseEventHandler(MyMouseEventHandler));
    }


    private void MyMouseEventHandler(object sender, MouseEventArgs e)
    {
        // To stop the tooltip from appearing, mark the event as handled
        // But not sure if it is really working
        e.Handled = true;

        FrameworkElement source = e.OriginalSource as FrameworkElement;
        if (null != source && null != source.ToolTip)
        {
            // This really disables displaying the tooltip. It is enough only for the current element...
            source.SetValue(ToolTipService.IsEnabledProperty, false);

            // Instead write the content of the tooltip into a textblock
            textBoxDescription.Text = source.ToolTip.ToString();
        }
    }

テキストブロックのデータバインディングはなく、コードからテキストを単純に設定するだけです。

私の問題は、ダイアログが ShowDialog() メソッドで開始されたときに、これが最初の実行で正常に機能することです。しかし、閉じて (または非表示にして) 再度表示した後、 textBoxDescriptionは更新されなくなります。イベントが発生して処理されます。デバッグ時に、コントロールがtextBoxDescription.Textが設定されている行にまで移動し、単に TextBlock が更新されないことがわかります。TextBlock を TextBox に置き換えようとしましたが、同じ結果になりました。

TextBlock を強制的に更新する方法はありますか? なぜそれが必要なのですか?なぜそれが初めて機能するのですか?

よろしくお願いします。

4

1 に答える 1

0

MyWindow タイプの静的コンストラクターで RegisterClassHandler を実行し、静的メソッドを提供してみてください。

textBoxDescription 要素を見つけるには、コールバック メソッドで別のことを行う必要があります (静的であるため)。Window 要素が見つかるまで、LogicalTree.GetParent を再帰的に使用します。次に、LogicalTree.FindLogicalNode を実行します。 textBoxDescription という名前の要素を見つけます。

http://www.japf.fr/2009/08/wpf-memory-leak-with-eventmanager-registerclasshandler/

public partial class MyWindow : Window
{
    static MyWindow()
    {
        EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.MouseEnterEvent, new MouseEventHandler(MyMouseEventHandler));
    }

    public MyWindow()
    {
        InitializeComponent();
    }

    static private void MyMouseEventHandler(object sender, MouseEventArgs e)
    {
        // To stop the tooltip from appearing, mark the event as handled
        // But not sure if it is really working
        e.Handled = true;

        FrameworkElement source = e.OriginalSource as FrameworkElement;
        if (null != source && null != source.ToolTip)
        {
            // This really disables displaying the tooltip. It is enough only for the current element...
            source.SetValue(ToolTipService.IsEnabledProperty, false);

            // Instead write the content of the tooltip into a textblock
            textBoxDescription.Text = source.ToolTip.ToString();
        }
    }
于 2012-07-13T02:03:31.730 に答える