我是 WPF 的新手。我正在尝试从 WPF 4 Unleashed 一书中修改项目 VisualStudioLikePanes。因为在我运行项目之前 Pane 默认是隐藏的,所以我决定将我正在处理的 Pane 放入一个单独的 xaml 文件中,这样我就可以看到我对 Pane 所做的更改而无需启动可执行文件。
因此,根据几天前我在 StackOverflow 上阅读的一些帖子,我在示例项目中添加了一个新的 UserControl,并将相关 Pane 的内容放入其中。以下是“子”XAML 文件中的 UserControl 属性:
<UserControl x:Class="Sample.SettingsPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d">
为了将此控件包含到父级中,我将 xmlns:sp 命名空间添加到“父级”XAML 文件中:
<Window
Title="MainWindow"
x:Uid="Window_1" x:Class="Sample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sp="clr-namespace:Sample"
x:Name="window">
然后我通过这个“包含”控件:
<sp:SettingsPanel Visibility="Collapsed" x:Name="layer1" x:FieldModifier="private" />
我立即发现,在“父”XAML 文件的代码隐藏文件中,引用“子”XAML 文件中现在包含的任何元素的所有代码现在都无法识别。因此,我随后删除(或注释掉)对名称和对象的所有引用,这些引用现在包含在“子”XAML 文件中,并且从那时起一直在跳过箍以将事物连接起来。
例如,我希望“子”XAML 文件中的一个 TextBox 反射(reflect)“父”XAML 文件中的 TextBox 中的内容。我相信以下绑定(bind)会起作用,但是,当然,我不能将它放入“子”XAML 中,因为它不再“知道”父元素的“测试”元素。
<TextBox Text="{Binding ElementName=test, Path=Text}" />
我确定我错误地分解了“父”XAML 文件。我无法想象每次有人想将 XAML 的某些部分拆分为另一个文件时,他们必须重新编写所有代码并设置特殊的通信技巧以让元素继续通信。
我确实查看了各种帖子(例如 Binding two UserControls to the same DataContext, or ViewModel? 和 What is the easiest way to break up large XAML files in my application? ),但它们没有解决我的特定问题。
谢谢,
马特
最佳答案
当您将元素拆分为 UserControl 时,您仍然可以通过您提供的 x:Name 字段值访问它们。但是,由于您是 WPF 的新手,所以在您养成任何“坏习惯”之前,我会开始研究 MVVM 模式。它专门解决了您的担忧。
关于wpf - 如何将大型 XAML 文件分解为子 XAML 文件并保持父对象和子对象之间的通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9622060/