【发布时间】:2012-03-08 17:30:27
【问题描述】:
我是 WPF 新手。我正在尝试从 WPF 4 Unleashed 一书中修改项目 VisualStudioLikePanes。因为在我运行项目之前窗格默认是隐藏的,所以我决定最好将我正在处理的窗格放入一个单独的 xaml 文件中,这样我就可以看到我对窗格所做的更改而无需启动可执行文件。
因此,根据几天前我在 StackOverflow 上阅读的一些帖子,我在示例项目中添加了一个新的 UserControl,并将相关窗格的内容放入其中。以下是“子”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 反映“父”XAML 文件中的 TextBox 中的内容。我相信以下绑定会起作用,但是,当然,我不能将它放入“子”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?),但它们没有解决我的特定问题。
谢谢,
马特
【问题讨论】:
-
如果您希望 XML(XAML 是 XML 的一种)做它所做的事情(例如引用),那么您需要保留它。拆分未耦合的部分是一回事,但父子节点是非常紧密的耦合。