【发布时间】:2013-12-18 11:27:39
【问题描述】:
编辑(如评论:XY-Problem) - 问题:
我想创建自己的控件,该控件具有预定义的样式和特殊元素(按钮、...)的位置,但总的来说,所有内容都应该能够放置在我的自定义控件中。在我的例子中,自定义控件只是一个“菜单栏”,它应该能够在“GUI 代码”中的任何地方使用——但不需要它必须在那里。但是 当 使用它时,它应该在任何地方都是相同的样式和行为。一种样式 - 我认为 - 还不够,因为此菜单栏中还有预定义的元素(例如,帮助已经在菜单栏中)
编辑结束。
我想在 WPF 中构建一个自定义控件(只是一个特殊的堆栈面板),具有以下要求: 可用作 xaml 中的任何其他控件 已为自定义控件中的控件定义样式
首先,我只是尝试创建一个 UserControl,其中包含一个具有已定义样式(在 xaml 中)的堆栈面板,用于包含元素(例如 Button)。此 UserControl 包含
<ContentPresenter />
在 xaml 中。使用此方法无法命名包含的元素。例如:
<mynamespace:MyStackPanel>
<Button Name="w00t">This does not work!</Button>
</mynamespace:MyStackPanel>
接下来的尝试是创建一个“真正的”自定义控件。这个自定义控件只是一个没有 xaml 的类。代码非常简单。类继承自 UserControl,只包含:
StackPanel sp = new StackPanel();
sp.Children.Add(new ContentPresenter());
this.AddChild(sp);
Woooohoooo,现在可以命名包含的元素了。但仍然是一个大问题:如何定义样式?
我可以在 ResourceDictionary 中为我自己的自定义控件定义样式。但我必须将 ResourceDictionary 添加到全局(App.xaml)资源中。然后我可以只为我的自定义控件定义样式 - 而不是包含元素? - 但无论如何……这样做感觉不对!
所以主要问题是:创建可以像任何其他控件一样在 xaml 中使用的自定义控件的“正确”方法是什么?如果第二种方法是正确的方法 - 怎么可能像我在 xaml 中那样设置样式(例如,这个元素中的每个 Button 都有一个特殊的样式)并让它成为一个“全局”ResourceDictionary?
它是如何在第三方产品中实现的?
【问题讨论】:
-
你为什么要“命名”东西开头?
-
不能使用
Name属性时可以使用x:Name属性, but as @HighCore said, why would you want to do that? To answer your question, the 'correct' way to create aCustomControl`可以在MSDN的Control Authoring Overview页面找到。 -
元素必须命名,以便我可以在后面的代码中使用它们 - 例如动态创建一个 TabView。
-
如果你想在容器内设置 UI 元素的样式,只需为这些 UI 元素添加样式(例如
<Style TargetType="Button.../>到容器的Resources,例如<MyStackPanel.Resources><ResourceDictionary Source="MyStyles.xaml"/></MyStackPanel>或其他东西。跨度> -
@marty
The elements has to be named so I can use them in the code behind- 错误。不要在 WPF 的过程代码中操作 UI 元素。这就是 XAML 的用途。