あなたが説明したように行う方法はありません(複数の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>
次に、タブ項目の 1 つを単純化して...
<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");
}
(私がたくさんの配管コードを言ったように)