gpt4 book ai didi

c# - Button.Click 自定义控件

转载 作者:行者123 更新时间:2023-11-30 16:23:41 24 4
gpt4 key购买 nike

我想创建一个从 ContentControl 派生的新自定义控件(它将成为窗口中其他控件的容器),但我想要一个按钮来关闭它。 (事实上​​我想要一个无边框的窗口,但是用类似系统的按钮来关闭它)。

所以我为包含两行网格的控件创建了样式,在上面一行有一个带有单个按钮的 StackPanel。

如何将按钮的 Click 事件绑定(bind)到控件本身,引发事件,甚至将关闭命令发送到父窗口?

<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)
{

}

最佳答案

听起来您已将模板创建为资源,因此它在运行时应用于控件。

您需要确保在 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 路由事件并检查是否在父级单击了按钮 -​​ 我自己会试一试...

关于c# - Button.Click 自定义控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11331039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com