3

ContentControl から派生した新しいカスタム コントロール (ウィンドウ内の他のコントロールのコンテナーになります) を作成したいのですが、それを閉じるボタンが必要です。(実際、ボーダーレスウィンドウが必要ですが、システムのようなボタンで閉じることができます)。

そこで、2 つの行を持つ Grid を含むコントロールのスタイルを作成しました。上の行には、1 つのボタンを持つ StackPanel があります。

ボタンの Click イベントをコントロール自体にバインドしたり、イベントを発生させたり、Close コマンドを親ウィンドウに送信したりするにはどうすればよいですか?

<Grid>
<Grid.RowDefinitions>
    <RowDefinition Height="20" />
    <RowDefinition />
</Grid.RowDefinitions>
<Border Background="Azure" Grid.Row="0">
    <StackPanel Orientation="Horizontal">
        <Button HorizontalAlignment="Right" Content="X" Click="Close_Click" />
    </StackPanel>
    </Border>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="1"/>
</Grid>

そして背後にあるコード:

static STContentControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(STContentControl), new FrameworkPropertyMetadata(typeof(STContentControl)));
}

public void Close_Click(object sender, RoutedEventArgs ea)
{

}
4

1 に答える 1

3

テンプレートをリソースとして作成したように聞こえるので、実行時にコントロールに適用されます。

OnApplyTemplate メソッドでボタンのクリック イベントを確実に接続する必要があります (コントロールでこれをオーバーライドします)。

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onapplytemplate.aspx

したがって、次のように UC でこれをオーバーライドします。

class NewUC : UserControl
{
    public event EventHandler CloseClicked;

    public override void OnApplyTemplate()
    {
        Button btn = this.FindName("SomeButton") as Button;

        if (btn == null) throw new Exception("Couldn't find 'Button'");

        btn.Click += new System.Windows.RoutedEventHandler(btn_Click);
    }

    void btn_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        OnCloseClicked();
    }

    private void OnCloseClicked()
    {
        if (CloseClicked != null)
            CloseClicked(this, EventArgs.Empty);
    }
}    

親ウィンドウで処理できる CloseClicked イベントを例に追加しました。これはルーティング イベントではないため、親コントロールに手動で接続する必要があります。

MouseLeftButtonDown ルーティング イベントを使用して、親レベルでボタンがクリックされたかどうかを確認することもできると思います。

于 2012-07-04T14:48:41.967 に答える