1

有几个人问过如何将大型 XAML 文件拆分成更小的更易于管理或可读的块。就我而言,我有一个包含 10 个选项卡的 XAML 文件,每个选项卡都有很多复杂的控件。因此,用于此的 XAML 文件很大且难以阅读。

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

我确定这是一个真正的菜鸟问题,但是如果您要做的只是拆分 XAML 文件,那么在不拆分 C# 的情况下如何做到这一点呢?当您创建 WPF 用户控件时,Visual Studio 会创建一个新的 XAML 文件新的代码隐藏文件,以使用它并处理事件。

我真正想要的是相当于 XAML 的“C# 部分”指令,因此我可以将它拆分到多个文件中,但将事件处理在一个地方。我能离那有多近?

提前致谢!

4

1 回答 1

1

没有办法按照您的描述进行(允许多个 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");
}

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

于 2012-09-24T21:42:54.120 回答