WPF - 如何在设置内容属性时保留当前内容

时间:2017-07-31 12:03:04

标签: c# wpf xaml

我遇到一个问题,通过设置窗口的内容属性,我显然删除了预先存在的内容。在所有窗口上,我都有一个dockpanel,用于向用户弹出帮助上下文帮助,但是当我设置窗口的content属性时,这会丢失。因此,我只会看到我添加的控件的内容,并且由于dockpanel不存在而按F1不会执行任何操作。我不想将这个dockpanel添加到每个控件,因为它的代码重用很差,所以我该怎样做才能将dockpanel保留在窗口上并添加内容而不会覆盖窗口的原始内容?

这是我设置窗口内容的代码。

LocalTime now(ZoneId.of("Europe/London"))

这是我的帮助控件的代码,它只是一个文档查看器,用于读取xps文档,这是由dockpanel使用的。

private void btnHelp_Click(object sender, RibbonControlEventArgs e)
    {
        System.Windows.Window window = new ResizeableWindow()
        {
            Title = "Help",
            Content = new Controls.Help(),
            ResizeMode = ResizeMode.NoResize

        };

        window.ShowDialog();
    }

这是包含Dockpanel的ResizableWindow的xaml

public partial class Help : UserControl
{
    public Help()
    {
        InitializeComponent();

        string appPath = "path";

        XpsDocument doc = new XpsDocument(appPath, FileAccess.Read);

        var docx = doc.GetFixedDocumentSequence();

        HelpDocViewer.Document = docx;
    }
}

以下是可调整大小窗口的代码

<Window x:Class="Controls.ResizeableWindow"           
        KeyDown="HelpKeyListen">   

    <Grid>
        <DockPanel x:Name="HelpPanel">

        </DockPanel>

    </Grid>       

</Window>

1 个答案:

答案 0 :(得分:1)

DockPanel内使用占位符,而不是替换窗口内容:

<DockPanel x:Name="HelpPanel">
    <ContentControl x:Name="HelpContent" DockPanel.Dock="Right"/>
    <ContentControl x:Name="MainContent"/>
</DockPanel>

然后根据需要分配contentcontrols的内容

private void HelpKeyListen(object sender, KeyEventArgs e)
{
    if (e.Key == Key.F1)
    {
        HelpContent.Content = new Help();
    }
}

如果要从外部提供主要内容,可能会在ResizeableWindow中创建新的依赖项属性。假设您添加了一个名为propdp的依赖项属性(visual studio code snipped MainContent),然后您可以按如下方式绑定它:

<DockPanel x:Name="HelpPanel">
    <ContentControl x:Name="HelpContent" DockPanel.Dock="Right"/>
    <ContentControl x:Name="MainContentPlaceholder" Content="{Binding MainContent,RelativeSource={RelativeSource AnchestorType=Window}}"/>
</DockPanel>

更合适的选择是用更多的WPF / MVVM友好方式替换MainContentPlaceholder以显示您的内容,但这超出了问题的范围。