私は WPF の初心者で、ユーザー コントロールからの継承に問題があります。
ユーザー コントロールを作成しましたが、そのコントロールを継承して、さらに機能を追加する必要があります。
誰かが前にこの種のことをしたことがありますか? どんな助けでも大歓迎です。
ありがとうございました
私は WPF の初心者で、ユーザー コントロールからの継承に問題があります。
ユーザー コントロールを作成しましたが、そのコントロールを継承して、さらに機能を追加する必要があります。
誰かが前にこの種のことをしたことがありますか? どんな助けでも大歓迎です。
ありがとうございました
さて..ベースコントロールを作成します
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:どうやらこの投稿+コメントから、あなたが望むことができないかもしれないと思います。
ちなみに、xamlを継承することはできません。継承できるのは、コードビハインドのみです。
最近、プロジェクトで同じ問題が発生しました。問題を解決する方法は、ユーザーコントロールを作成し、それを「子」ユーザーコントロールに追加することでした。
それがうまくいかない場合/ヘルプはこれを見てください:http: //geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx 1
少し解決策があるかもしれません:継承の代わりに合成 - データバインディングを介して外部から割り当て可能な「コンテンツスロット」を持つコントロールを思いつきました。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>
コード ビハインドのいくつかの処理コードと合わせて、ダイアログ ウィンドウの優れたベース コンポーネントになります。
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」コントロールを他のすべての派生コントロールのテンプレートとして使用できます。
を使用してこれを実現できますdelegate
。
基本的に、必要なYourInterface
機能をラップするインターフェイス ( ) を作成し、ユーザー コントロールとクラスの両方にそのインターフェイスを実装する必要があります。
次に、ユーザー コントロールがタイプ のオブジェクトへの参照を持っていることを確認しますIYourInterface
。これにより、ユーザー コントロールが のメソッドを呼び出そうとしたときに、Interface
クラスのメソッドが呼び出されます。
ユーザー コントロールとクラスはどちらも同じインターフェイスを実装しているため、同じ種類のオブジェクトと見なすことができます。つまり、両方を type のオブジェクトのコレクションに入れることができますIYourInterface
。これにより、必要な動作が得られるはずです。
abstract class
ASP.NET では、クラスを祖先から継承させることで、この手法をよく使用します。WPF がこれをサポートしていない理由がわかりません。:(