簡體   English   中英

繼承屬性的Fluent WPF API

[英]Fluent WPF API for inherited properties

有時,我會有一些WPF C#代碼,我想以“流利”的方式編寫。

例如,我可能想設置一個包含ScrollViewerWindow

new Window()
    .SetContent(
        new ScrollViewer()
            .SetContent(
                ...))

為了實現這種API,我一直在使用如下擴展方法:

static class FluentScrollViewer
{
    public static ScrollViewer SetContent(this ScrollViewer obj, object val)
    { obj.Content = val; return obj; }
}

static class FluentWindow
{
    public static Window SetContent(this Window obj, object val)
    { obj.Content = val; return obj; }
}

現在, WindowScrollViewer都從ContentControl繼承Content屬性。 但是,我必須分別為每個類定義SetContent擴展方法。

如果我嘗試做這樣的事情:

static class FluentContentControl
{
    public static ContentControl SetContent(this ContentControl obj, object val)
    { obj.Content = val; return obj; }
}

然后像這樣使用它:

new Window().SetContent(...)

SetContent方法當然不會返回Window

有沒有辦法在ContentControl上定義SetContent並讓它做“正確的事”,從而避免定義很多單獨的專門化方法,除了類型之外,這些方法都相似?

您可以使用泛型:

public static TControl SetContent<TControl>(this TControl obj, object val)
where TControl : ContentControl
{ 
    obj.Content = val; 
    return obj; 
}

我不認為在創建新控件時會有什么好處,因為您還可以使用初始化程序

new Window() {
    Content = new ScrollViewer() { Content = ... }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM