Wpf “用户控制事件时”;“拆分”;XAML文件

Wpf “用户控制事件时”;“拆分”;XAML文件,wpf,Wpf,有几个人问过如何将大型XAML文件分割成更小、更易于管理或可读的块。在我的例子中,我有一个包含10个选项卡的XAML文件,每个选项卡都有很多复杂的控件。因此,用于此的XAML文件非常庞大且难以读取 对此的“标准”答案似乎是用户控件 我确信这是一个真正的noob问题,但是如果您只想分割XAML文件,那么如何在不分割C#的情况下进行分割呢?创建WPF用户控件时,VisualStudio将创建一个新的XAML文件plus新的代码隐藏文件,以处理事件 我真正想要的是相当于XAML的“C#partial”

有几个人问过如何将大型XAML文件分割成更小、更易于管理或可读的块。在我的例子中,我有一个包含10个选项卡的XAML文件,每个选项卡都有很多复杂的控件。因此,用于此的XAML文件非常庞大且难以读取

对此的“标准”答案似乎是用户控件

我确信这是一个真正的noob问题,但是如果您只想分割XAML文件,那么如何在不分割C#的情况下进行分割呢?创建WPF用户控件时,VisualStudio将创建一个新的XAML文件plus新的代码隐藏文件,以处理事件

我真正想要的是相当于XAML的“C#partial”指令,这样我就可以将它拆分到多个文件中,但将事件处理在一个地方。我离那有多远


提前谢谢

没有办法按照您描述的那样做(允许多个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>


(就像我说的很多管道代码)

没有办法按照您描述的那样(允许多个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>


(就像我说的很多管道代码)

我已经使用了样式来处理大量重复的情况。这是一个我在.Net/WPF中重写旧VB6应用程序的项目。大选项卡控件控制着一个大型复杂的工业机器,有数百种设置和选项。我对用户控件不太熟悉,但是你的回答暗示了用户控件和框架提供的控件之间的巨大差异。我可以在我的应用程序中按下一个股票按钮,然后处理应用程序中的点击事件。但是,如果我创建一个“按钮”用户控件并在我的应用程序中关闭它,那么单击事件将在用户控件的代码中处理,而不是在我的应用程序中?是这样吗?那么,用户控件有什么好处呢?使用自定义控件会更好吗?@user316117您可以从应用程序中处理单击事件,但它需要为每个事件设置一个小管道,自定义控件只会使事情变得更困难。给我一点时间,我会详细说明我的答案。我已经使用了样式来处理大量重复的情况。这是一个我在.Net/WPF中重写旧VB6应用程序的项目。大选项卡控件控制着一个大型复杂的工业机器,有数百种设置和选项。我对用户控件不太熟悉,但是你的回答暗示了用户控件和框架提供的控件之间的巨大差异。我可以在我的应用程序中按下一个股票按钮,然后处理应用程序中的点击事件。但是,如果我创建一个“按钮”用户控件并在我的应用程序中关闭它,那么单击事件将在用户控件的代码中处理,而不是在我的应用程序中?是这样吗?那么,用户控件有什么好处呢?使用自定义控件会更好吗?@user316117您可以从应用程序中处理单击事件,但它需要为每个事件设置一个小管道,自定义控件只会使事情变得更困难。给我一点时间,我会详细说明我的答案。您可能会将许多东西,如
转换器
画笔
,甚至
选项卡项.Template
提取到一个单独的
资源字典
文件中,只需在XAML文件顶部导入
ResourceDictionary
,而不使用用户控制。您可能会将许多东西,如
转换器
画笔
,甚至
选项卡项.模板
提取到一个单独的
ResourceDictionary
文件中,只需导入XAML文件顶部的
ResourceDictionary
,而不用使用用户控件
<UserControl ...>
    <Button Click="OnClick"/>
</UserControl>
<Window>
    <local:UserControl1 ButtonClickHandler="Button_Click" />
</Window>
private void Button_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Click");
}