我遇到一个问题,通过设置窗口的内容属性,我显然删除了预先存在的内容。在所有窗口上,我都有一个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>
答案 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
以显示您的内容,但这超出了问题的范围。