【问题标题】:Adding and changing usercontrol at run time in a WPF application在 WPF 应用程序运行时添加和更改用户控件
【发布时间】:2010-12-18 02:11:21
【问题描述】:
我的情况如下,我将第一次使用 WPF,所以任何关于如何进行的建议都很好:
我有一个下拉菜单,当我从中选择任何项目时 - 它应该更改同一窗口中控件的结构。新控件包含 - 两个菜单项以及一个文本框和一个列表框。选择一个菜单项将显示文本框,其他将显示列表框。现在对于初始组合框中的每个项目,我将为每个菜单项提供不同的信息。
问题:
假设我在组合框中有 10 个项目 - 每个项目有 2 个菜单项 - 所以要显示 20 个不同的东西。
-- 我应该如何声明这 20 种不同的东西
-- 选择特定组合时我应该如何加载每个组合
【问题讨论】:
标签:
wpf
user-controls
controls
【解决方案1】:
您应该查看 ControlTemplate。您可以定义一组模板,然后将它们应用于控件,使它们成为您想要的任何东西。因此,当在您的下拉菜单上触发 item changed 事件时,加载并应用您想要的模板。
<!--- your xaml file --->
<Control x:Name="Main"/>
// you CS file....
OnItemChanage(....)
{
if ( Main!= null )
Main.Template = MyNewTemplate;
}
【解决方案2】:
如果您想一次显示多组控件,请将所有控件添加到您的窗口并使用数据绑定设置它们的Visibility,然后使用ComboBox 更新控件绑定到的属性。
或者,如果您只想一次显示一个控件,只需使用 ComboBox 中的 DataContext:
<Window.DataContext>
<x:Array x:Key="myItems">
<local:Item MenuItem1="abc" MenuItem2="def" />
<local:Item MenuItem1="ghi" MenuItem2="jkl" />
...
<local:Item MenuItem1="ghi" MenuItem2="jkl" />
</x:Array>
</Window.DataContext>
<Grid>
...
<ComboBox x:Name="selection" ItemsSource="{Binding}">
...
<StackPanel DataContext="{Binding /}" ...>
<MenuItem Header="{Binding MenuItem1}" OnClick="DisplayListBox" />
<MenuItem Header="{Binding MenuItem2}" OnClick="DisplayTextBox" />
<TextBox Visibility="Hidden" ... />
<ListBox Visibility="Hidden" ... />
</StackPanel>
</Grid>
为 DisplayListBox 和 DisplayTextBox 提供适当的代码