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

  • 本文关键字:保留 属性 设置 WPF c# wpf xaml
  • 更新时间 :
  • 英文 :


我遇到了一个问题,通过设置窗口的内容属性,我显然删除了预先存在的内容。在所有窗口中,我都有一个dockpanel,用于向用户弹出帮助上下文帮助,但是当我设置窗口的内容属性时,这会丢失。因此,我只会看到我添加的控件的内容,按 F1 不会执行任何操作,因为停靠面板不存在。我不想将此 dockpanel 添加到每个控件,因为它的代码重用性很差,那么我该怎么做才能将 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();
}

这是我的帮助控件的代码,它只是一个文档查看器来读取 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;
}
}

这是我的可调整大小窗口的 xaml,其中包含 Dockpanel

<Window x:Class="Controls.ResizeableWindow"           
KeyDown="HelpKeyListen">   
<Grid>
<DockPanel x:Name="HelpPanel">
</DockPanel>
</Grid>       
</Window>

这是可调整大小窗口的代码

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

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

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

然后根据需要分配内容控件的内容

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

如果要从外部提供主要内容,可以在ResizeableWindow中创建一个新的依赖项属性。假设您添加了一个名为MainContent的依赖项属性(Visual Studio 代码截取propdp(,然后您可以按如下方式绑定它:

<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来显示您的内容,但这超出了问题的范围。

最新更新