没有办法按照您的描述进行(允许多个 xaml 文件共享相同的 c# 代码)。此外,根据您的描述,没有一种简单的方法可以快速抽象该代码而无需进行一些更改。由于 wpf 事件通常由命令驱动,因此最好的解决方案可能是将事件更改为触发命令,而不是将逻辑放在实际事件处理程序本身中,然后从用户控件调用它是微不足道的。
但是在更改所有代码之前,您可以使用样式抽象出很多冗长的东西,这些样式更容易抽象出来并且不应该与您的事件混淆。因此,如果您注意到在许多控件中重复设置的方式,只需将其全部声明为样式,您就可以将其移动到其他地方的资源字典中以消除一些混乱。
详细说明一下,您不仅可以使用样式来停止重复,还可以抽象出您定义控件的方式(就像您尝试使用用户控件一样,您也可以在那里定义事件)。例如...
<Style TargetType="TabItem" x:Key="Tab1Style">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<!--Note even if this style is defined in a resource file the
events will still be tied to the class of the control
using the style-->
<Button Click="Button_Click"/>
<Button Click="Button_Click_1" />
<Button Click="Button_Click_2" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
然后将您的一个 tabitems 简化为...
<TabControl>
<TabItem Style="{StaticResource Tab1Style}" />
</TabControl>
如果您真的对用户控件有信心,您也可以将所有事件路由出去。像这样的东西...
<UserControl ...>
<Button Click="OnClick"/>
</UserControl>
public partial class UserControl1 : UserControl
{
public static readonly RoutedEvent ButtonClick = EventManager.RegisterRoutedEvent(
"ButtonClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserControl1));
public event RoutedEventHandler ButtonClickHandler
{
add { AddHandler(ButtonClick, value); }
remove { RemoveHandler(ButtonClick, value); }
}
private void OnClick(object sender, RoutedEventArgs e)
{
RoutedEventArgs newEventArgs = new RoutedEventArgs(UserControl1.ButtonClick);
RaiseEvent(newEventArgs);
}
public UserControl1()
{
InitializeComponent();
}
}
<Window>
<local:UserControl1 ButtonClickHandler="Button_Click" />
</Window>
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Click");
}
(就像我说的很多管道代码)