2017-07-31 29 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