【问题标题】:Wrapping window content in base window class在基窗口类中包装窗口内容
【发布时间】:2013-05-02 15:09:47
【问题描述】:

在具有多个从基类-BaseWindow 继承的窗口的应用程序中,我希望在每个窗口上都有一个状态栏。我认为这必须通过代码来完成,因为一个 XAML 生成的类不能从另一个类继承。

XAML 如下所示:

<my:BaseWindow x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication1">
    <StackPanel>
        <TextBlock Text="Content" />
    </StackPanel>
</my:BaseWindow>

和 BaseWindow 类:

public class BaseWindow : Window {
    protected override void OnContentChanged(object oldContent, object newContent) {
        var sb = new StatusBar();
        sb.Items.Add(new TextBlock {
            Text = "Status bar"
        });

        var dp = new DockPanel();
        dp.Children.Add(sb);
        DockPanel.SetDock(sb, Dock.Bottom);
        dp.Children.Add((UIElement)newContent);

        base.OnContentChanged(oldContent, dp);
    }
}

引发以下错误:在附加到新的父 Visual 之前,必须断开指定子与当前父 Visual 的连接。

我该如何解决这个问题?或者,我可以使用哪些其他技术来实现这一点?

【问题讨论】:

  • 何时/何时引发该错误?
  • 在对base.OnContentChanged的调用中。

标签: wpf


【解决方案1】:

您可以将其作为“子”窗口的容器,而不是从基本窗口继承,例如通过将它们制作成 Pages 并将它们放入基本窗口内的 Frame 中,或者将它们制作成 UserControls 并使用 DataTemplates 在不同的窗口之间切换。

您还可以使用 ContentPresenter 使您的 BaseWindow 成为 UserControl,而不是从它继承,您可以将它用作窗口的第一个内容元素,并将它们需要显示的任何其他内容放入其中。

【讨论】:

  • 我需要从 BaseWindow 继承有两个原因:BaseWindow 公开了其他功能(属性/方法),这些功能应该可用于每个窗口,并且因为 BaseWindow 本身继承自另一个提供附加功能的类。跨度>
  • 嗯,在 WPF 和 XAML 中,通过聚合重用功能更为常见,即将其放入可重用组件并在更高级别的分组中使用这些组件,而不是通过继承。
  • 这不是我现在可以改变的。
【解决方案2】:

设置Content 而不是调用base.OnContentChanged 有效:

Content = dp;

但是,直接设置Content会调用OnContentChanged,导致死循环。对于我此时的需要,一个简单的标志就足够了:

private bool firstRun = true;
protected override void OnContentChanged(object oldContent, object newContent) {
    if (!firstRun) { return; }

    ...

    firstRun = false;
    Content = dp;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 2011-06-13
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多