1

大きな XAML ファイルを、より管理しやすく読みやすい小さなチャンクに分割する方法について、何人かから質問がありました。私の場合、10 個のタブを持つ XAML ファイルがあり、各タブには多くの複雑なコントロールがあります。したがって、このための XAML ファイルは巨大で読みにくいです。

これに対する「標準的な」答えは、ユーザー コントロールのようです。

これは本当に初歩的な質問だと思いますが、XAML ファイルを分割するだけなら、C# も分割せずにどうすればよいでしょうか? WPF ユーザー コントロールを作成すると、Visual Studio は新しい XAML ファイル新しいコード ビハインド ファイルを作成し、それに合わせてイベントを処理します。

私が本当に欲しかったのは、XAML の "C# 部分的" ディレクティブに相当するものでした。これにより、複数のファイルに分割し、イベントを 1 か所で処理することができました。それにどこまで近づけるか?

前もって感謝します!

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>

次に、タブ項目の 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");
}

(私がたくさんの配管コードを言ったように)

于 2012-09-24T21:42:54.120 に答える