WPF控制操作
我需要动态地将控件添加到窗口中。例如,对于组合框,我需要使用自定义框架进行映射,该框架将查找映射到该组合框 因此,每当组合框映射为lookup时,我都需要在组合框的右侧添加一个(+)按钮。。此(+)按钮用于打开相应的查找表单,以将项目添加到组合框中 为此,我需要做以下工作WPF控制操作,wpf,Wpf,我需要动态地将控件添加到窗口中。例如,对于组合框,我需要使用自定义框架进行映射,该框架将查找映射到该组合框 因此,每当组合框映射为lookup时,我都需要在组合框的右侧添加一个(+)按钮。。此(+)按钮用于打开相应的查找表单,以将项目添加到组合框中 为此,我需要做以下工作 在Mapper中,我需要使用(+),为按钮标签创建实例 我需要创建一个面板,即容纳两个控件的容器(组合框、按钮) 为了用创建的面板替换Combobox,我需要从Combobox的父控件中删除Combobox,并将panel添加
提前感谢,Dinesh我建议使用视图和视图模型分离的MVVM模式。要解决您的问题,您可以使用DataTemplates和。基本上,您应该准备不同的数据模板,这取决于特定ViewModel开关视图(XAML布局)上应用程序的内部状态 1)在参考资料中定义所有模板:
<!-- namespace where GridView .xaml and ChartView .xaml are -->
xmlns:views="clr-namespace:Gui.Views"
...
<DataTemplate x:Key="GridDataTemplate">
<views:GridView />
</DataTemplate>
<DataTemplate x:Key="ChartDataTemplate">
<views:ChartView />
</DataTemplate>
<Control....
<ContentPresenter
ContentTemplateSelector="{StaticResource YourDataTemplateSelector}" />
private sealed class YourDataTemplateSelector: DataTemplateSelector
{
public override DataTemplate SelectTemplate(
object item,
DependencyObject container)
{
DataTemplate dataTemplate = null;
IViewModel viewModel = item as IViewModel;
if (viewModel.ViewType == Grid)
{
dataTemplate = this.Resources["GridDataTemplate"];
}
// ...
return dataTemplate;
}
}
编辑:动态生成控件
- 您可以使用来遍历树控件, 查找子控件,检查它们是否属于特定类型,然后删除/更新
- 您可以通过
属性引用父控件control.parent
- 您可以使用
(父控件作为面板)删除任何子控件。Children.remove()
- 您可以使用
(parent as Panel).Children.add()添加控件。
<!-- namespace where GridView .xaml and ChartView .xaml are -->
xmlns:views="clr-namespace:Gui.Views"
...
<DataTemplate x:Key="GridDataTemplate">
<views:GridView />
</DataTemplate>
<DataTemplate x:Key="ChartDataTemplate">
<views:ChartView />
</DataTemplate>
<Control....
<ContentPresenter
ContentTemplateSelector="{StaticResource YourDataTemplateSelector}" />
private sealed class YourDataTemplateSelector: DataTemplateSelector
{
public override DataTemplate SelectTemplate(
object item,
DependencyObject container)
{
DataTemplate dataTemplate = null;
IViewModel viewModel = item as IViewModel;
if (viewModel.ViewType == Grid)
{
dataTemplate = this.Resources["GridDataTemplate"];
}
// ...
return dataTemplate;
}
}
编辑:动态生成控件
- 您可以使用来遍历树控件, 查找子控件,检查它们是否属于特定类型,然后删除/更新
- 您可以通过
属性引用父控件control.parent
- 您可以使用
(父控件作为面板)删除任何子控件。Children.remove()
- 您可以使用
(parent as Panel).Children.add()添加控件。
- 您可以使用
ContentControl
s吗?它们使您能够根据用户操作动态承载任何控件<代码>内容控件类似于可视占位符
您始终可以使用Trigger
s动态地将内容替换为内容控件
<StackPanel>
<TextBlock Text="{Binding Name}" />
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style>
<Setter ContentTemplate="{StaticResource EmployeeTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsManager}"
Value="True">
<Setter ContentTemplate="{StaticResource ManagerTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</StackPanel>
因此,如果绑定的
Employee
对象具有IsManager=true
则会在堆栈面板下为经理员工创建一个新模板。您可以使用ContentControl
s吗?它们使您能够根据用户操作动态承载任何控件<代码>内容控件类似于可视占位符
您始终可以使用Trigger
s动态地将内容替换为内容控件
<StackPanel>
<TextBlock Text="{Binding Name}" />
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style>
<Setter ContentTemplate="{StaticResource EmployeeTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsManager}"
Value="True">
<Setter ContentTemplate="{StaticResource ManagerTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</StackPanel>
因此,如果绑定的
Employee
对象具有IsManager=true
则会在堆栈面板下为经理员工创建一个新模板。没问题,我只是这样做。。问题是我想重新封装网格或任何其他容器中的现有控件。@dinesh:这样,每个控件类型GridView.xaml、ChartView.xaml都可以有单独的视图,然后根据ViewModel的状态(ReportView==网格或图表)选择适当的视图我没有得到您想要的吗?。。简单的问题是,我们如何使用这个组合框获得控件(组合框)的部分(网格)。。也就是说,我们只知道ComboBox的一个实例。。那么,我们如何用Pannel(Combobox+按钮)替换Combobox中的组合框(仅在C#code ie中,以编程方式…)@dinesh:请参阅我回答的编辑部分。所以,Parrent将始终引用该控件的Parrent,即如果ComboBox添加到Grid,它将是Grid,如果Pannel,它将是Pannel right。。因为我赢了,只是那样而已。。但在wpf中,大多数人都在使用VisualTreheler。。。所以我很困惑。。是的,谢谢。。有没有详细解释的链接?。:)没关系,我只是这样做而已。。问题是我想重新封装网格或任何其他容器中的现有控件。@dinesh:这样,每个控件类型GridView.xaml、ChartView.xaml都可以有单独的视图,然后根据ViewModel的状态(ReportView==网格或图表)选择适当的视图我没有得到您想要的吗?。。简单的问题是,我们如何使用这个组合框获得控件(组合框)的部分(网格)。。也就是说,我们只知道ComboBox的一个实例。。那么,我们如何用Pannel(Combobox+按钮)替换Combobox中的组合框(仅在C#code ie中,以编程方式…)@dinesh:请参阅我回答的编辑部分。所以,Parrent将始终引用该控件的Parrent,即如果ComboBox添加到Grid,它将是Grid,如果Pannel,它将是Pannel right。。因为我赢了,只是那样而已。。但在wpf中,大多数人都在使用VisualTreheler。。。所以我很困惑。。是的,谢谢。。有没有详细解释的链接?。:)我需要用不同的方式做这件事。。所以我需要正确的解决方案。。例如,我需要替换网格中的控件