34

私は WPF の初心者で、ユーザー コントロールからの継承に問題があります。

ユーザー コントロールを作成しましたが、そのコントロールを継承して、さらに機能を追加する必要があります。

誰かが前にこの種のことをしたことがありますか? どんな助けでも大歓迎です。

ありがとうございました

4

6 に答える 6

30

さて..ベースコントロールを作成します

public abstract class BaseUserControl : UserControl{...}

次に、XAML ファイルで:

<Controls:BaseUserControl x:Class="Termo.Win.Controls.ChildControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:Namespace.Of.Your.BaseControl">

そして、それはうまくいくはずです。

編集:うーん..この例は、XAML を使用しない基本コントロールがあり、それを継承する場合に役立ちます。逆に (Xaml を使用したベース コントロールから) - どうすればよいかわかりません。

EDIT2:どうやらこの投稿+コメントから、あなたが望むことができないかもしれないと思います。

于 2008-11-06T15:32:48.543 に答える
18

ちなみに、xamlを継承することはできません。継承できるのは、コードビハインドのみです。

最近、プロジェクトで同じ問題が発生しました。問題を解決する方法は、ユーザーコントロールを作成し、それを「子」ユーザーコントロールに追加することでした。

それがうまくいかない場合/ヘルプはこれを見てください:http: //geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx 1

于 2008-11-07T06:56:50.817 に答える
4

少し解決策があるかもしれません:継承の代わりに合成 - データバインディングを介して外部から割り当て可能な「コンテンツスロット」を持つコントロールを思いつきました。SOスレッドを見てください。

使用例:

<UserControl ... >

    <!-- My wrapping XAML -->
        <Common:DialogControl>
                <Common:DialogControl.Heading>
                        <!-- Slot for a string -->
                </Common:DialogControl.Heading>
                <Common:DialogControl.Control>
                        <!-- Concrete dialog's content goes here -->
                </Common:DialogControl.Control>
                <Common:DialogControl.Buttons>
                        <!-- Concrete dialog's buttons go here -->
                </Common:DialogControl.Buttons>
        </Common:DialogControl>
    <!-- /My wrapping XAML -->

</UserControl>

コード ビハインドのいくつかの処理コードと合わせて、ダイアログ ウィンドウの優れたベース コンポーネントになります。

于 2009-06-23T18:06:13.740 に答える
3

xaml コード自体を継承することはできません。ただし、コード ビハインドの抽象クラスを作成すると、派生クラス オブジェクトからコード ビハインドを編集できるようになります。

Xaml コード: { Window1.xaml }

<Window 
x:Class="WPFSamples.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="auto" Width="256" Title="WPF Sameples">
  <Grid>
    <Button x:Name="Button1" VerticalAlignment="Center" HorizontalAlignment="Center" Content="Click Me"/>
  </Grid>
</Window>

CodeBehind: { Window1.xaml.cs }

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WPFSamples
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public abstract partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    }
}

派生クラス: { DisabledButtonWindow.cs }

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WPFSamples
{
    public sealed class DisabledButtonWindow : Window1
    {
        public DisabledButtonWindow()
        {
            Button1.IsEnabled = false;
        }
    }
}

wpf ソース自体から継承することはできませんが、この「Window1」コントロールを他のすべての派生コントロールのテンプレートとして使用できます。

于 2011-10-20T15:19:29.513 に答える
1

を使用してこれを実現できますdelegate

基本的に、必要なYourInterface機能をラップするインターフェイス ( ) を作成し、ユーザー コントロールとクラスの両方にそのインターフェイスを実装する必要があります。

次に、ユーザー コントロールがタイプ のオブジェクトへの参照を持っていることを確認しますIYourInterface。これにより、ユーザー コントロールが のメソッドを呼び出そうとしたときに、Interfaceクラスのメソッドが呼び出されます。

ユーザー コントロールとクラスはどちらも同じインターフェイスを実装しているため、同じ種類のオブジェクトと見なすことができます。つまり、両方を type のオブジェクトのコレクションに入れることができますIYourInterface。これにより、必要な動作が得られるはずです。

abstract classASP.NET では、クラスを祖先から継承させることで、この手法をよく使用します。WPF がこれをサポートしていない理由がわかりません。:(

于 2011-01-30T13:59:38.480 に答える