デスクトップ ウィンドウを表すクラスがあり、一部にはラッパー ( )Window
を介してタイトルを付けることができ、一部はラッパー ( ) を介して他のウィンドウの上に配置できます。TitledWindow
TopWindow
今、私は のビューモデルを作成しようとしておりWindow
、それらの 3 つのインターフェイス ( IWindow
、ITitledWindow
およびITopWindow
) をサポートする必要があります。次のようになります。
public class WindowViewModel : ITopWindow, ITitledWindow
{
private readonly IWindow _window;
public WindowViewModel(IWindow window)
{
_window = window;
}
public IntPtr Handle
{
get { return _window.Handle; }
}
public Boolean? IsTopmost
{
get
{
var thisTopWindow = _window as ITopWindow;
if (thisTopWindow == null)
return null;
return thisTopWindow.IsTopmost;
}
set
{
var thisTopWindow = _window as ITopWindow;
if (thisTopWindow != null)
thisTopWindow.IsTopmost = value;
}
}
public String Title
{
get
{
var thisTitledWindow = _window as ITitledWindow;
return thisTitledWindow == null ? null : thisTitledWindow.Title;
}
}
}
これは私がビューモデルを取得する方法です:
public IList<WindowViewModel> OpenWindows
{
get
{
var windowViewModels =
from window in _windowEnumerator.EnumerateWindows()
let titledWindow = new TitledWindow(window, _windowTitleReader)
let topWindow = new TopWindow(titledWindow, _topmostManager)
select new WindowViewModel(topWindow);
return windowViewModels.ToList();
}
}
問題は、階層内の最初のラッパーしか取得できないことです。
のすべてのウィンドウOpenWindows
もですが、フィールド内でラップするためでITopWindow
はありません(おそらくこのままにしておく必要があります)。ITitledWindow
private readonly
私が念頭に置いている唯一の解決策は、それらを結合するクラスを導入することです (のようにTitledTopWindow
) が、ウィンドウのすべてのバリエーションに対して作成する必要があり、それは面倒です (特に、後で新しい機能を導入するために新しいラッパーを導入するとき)。 .
それを行う適切な方法は何ですか?
更新:
私の検索では、機能を拡張するためにラッパーを使用しているが、API を拡張するために使用していないことを読みました (これがここでの目標です)。
この問題が私が意図した方法で対処できない場合、どうすればこの方法で機能を追加できますか?