2017-07-31 71 views
0

我正面临一个问题,通过设置我的窗口的内容属性,我显然删除了原有的内容。在所有窗口中,我有一个dockpanel,用于向用户弹出帮助上下文帮助,但在设置窗口的content属性时会丢失。因此,我只会看到我添加的控件的内容,并且由于dockpanel不存在,所以按F1不会执行任何操作。我不想将这个dockpanel添加到每个控件中,因为它很糟糕的代码重用,所以我可以做些什么来将dockpanel保留在窗口上并添加内容而不覆盖窗口的原始内容?WPF - 如何在设置内容属性时保留当前内容

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

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(); 
    } 

这是对我的帮助控件的代码,它只是一个文档查看器阅读XPS文档,这是使用的DockPanel中。

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; 
    } 
} 

这是一个包含DockPanel中

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

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

     </DockPanel> 

    </Grid>  

</Window> 

这里我ResizableWindow的XAML是用于调整大小窗口

public ResizeableWindow() 
    { 
     InitializeComponent(); 
    } 

    private void HelpKeyListen(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.F1) 
     { 
      var HelpControl = new Help(); 
      DockPanel.SetDock(HelpControl, Dock.Right); 
      HelpPanel.Children.Insert(0, HelpControl); 
     } 
    } 
+3

几行代码,显示您目前的做法会很好。这听起来像你的基本方法有一些问题,但很难从你的描述中分辨出来。 – grek40

+0

不要更改'Window'的'Content'。用你的页脚(或其他控件)和一个主ContentContarea来控制用户。将其中的一个添加到您的表单中,并在*上更改“Content”。 –

+1

此外,您应该*认真考虑*寻找WPF的MVVM模式。它会让WPF世界中的事情变得如此简单。 –

回答

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可能创建一个新的依赖属性,如果你想提供来自外部的主要内容。比方说你添加一个依赖属性(Visual Studio代码剪断propdp)命名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以显示您的内容,但这超出了问题的范围。

+0

感谢您的帮助,我将尝试通过我的功能区设置主要内容占位符,其中包含设置,关于和帮助的按钮。在他们的btn_click事件中,我将设置主要内容。 – benbants