5


Webで画像をポップアップするために見つけることができるものと同様に、wpfでオーバーレイを作成しようとしています(背景が暗くなります)。アプリケーションの複数の部分で、さまざまな種類のコンテンツで再利用できるようにしたいと考えています。

これは、装飾クラスのコンストラクターの一時的なコードです (試してみてください)。

private readonly Grid _grid = new Grid();

public DarkOverlayAdorner(UIElement adornedElement, Object content) :
        base(adornedElement)
{
     _grid.Background = new SolidColorBrush(Color.FromArgb(99, 0, 0, 0));
     IsHitTestVisible = true;
     var visual = content as UIElement;
     if (visual != null)
        _grid.Children.Add(visual);
}

(もちろん) クラスに加えて、装飾された要素、GetVisualChild、および VisualChildCount の正しいサイズを装飾者に与えるために、MeasureOverride と ArrangeOverride の ovverride があります。

ここでの問題は、装飾が正しく表示されますが、装飾された要素にイベントや動作が適用されないことです。例えば:

AdornerLayer layer = AdornerLayer.GetAdornerLayer(textBoxProva);
layer.Add(new DarkOverlayAdorner(textBoxProva, new Button{Content = "prova"}));

ここにボタンが表示されていますが、ボタンをクリックすることはできず、ボタンのマウスオーバーに対する効果は適用されません。私はまだ問題を理解できません。

4

2 に答える 2

7

わかりました、何が問題なのかを理解するのに多くの時間を費やしました。最後に、解決策を見つけました:

追加された要素がイベントに反応するようにしたい場合は、要素を装飾のビジュアル ツリーにバインドする必要があると思います。それを行う方法は、装飾者自体に初期化されたVisualCollectionを使用することです。

    VisualCollection visualChildren;
    FrameworkElement @object;

    public DarkOverlayAdorner(UIElement adornedElement) :
        base(adornedElement)
    {
        visualChildren = new VisualCollection(this);
        @object = new Button {Content = "prova"};
        visualChildren.Add(@object);
    }
    protected override Visual GetVisualChild(int index)
    {
        return visualChildren[index];
    }

このようにして、イベントは正しくルーティングされます。

于 2010-12-29T08:19:29.403 に答える
0

拡張WPFツールキットのChildWindowコントロールを確認することをお勧めします。これは、モーダル背景効果のあるウィンドウをポップアップするコントロールであり、ウィンドウ内に配置するコンテンツを指定できます。

于 2010-12-28T15:10:11.137 に答える