WPF控制操作

WPF控制操作,wpf,Wpf,我需要动态地将控件添加到窗口中。例如,对于组合框,我需要使用自定义框架进行映射,该框架将查找映射到该组合框 因此,每当组合框映射为lookup时,我都需要在组合框的右侧添加一个(+)按钮。。此(+)按钮用于打开相应的查找表单,以将项目添加到组合框中 为此,我需要做以下工作 在Mapper中,我需要使用(+),为按钮标签创建实例 我需要创建一个面板,即容纳两个控件的容器(组合框、按钮) 为了用创建的面板替换Combobox,我需要从Combobox的父控件中删除Combobox,并将panel添加

我需要动态地将控件添加到窗口中。例如,对于组合框,我需要使用自定义框架进行映射,该框架将查找映射到该组合框

因此,每当组合框映射为lookup时,我都需要在组合框的右侧添加一个(+)按钮。。此(+)按钮用于打开相应的查找表单,以将项目添加到组合框中

为此,我需要做以下工作

  • 在Mapper中,我需要使用(+),为按钮标签创建实例
  • 我需要创建一个面板,即容纳两个控件的容器(组合框、按钮)
  • 为了用创建的面板替换Combobox,我需要从Combobox的父控件中删除Combobox,并将panel添加到该控件中
  • 我们如何在WPF中做到这一点?即,动态替换代码隐藏中的控件


    提前感谢,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()添加控件。

    我建议使用视图和视图模型分离的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()添加控件。

      • 您可以使用
        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。。。所以我很困惑。。是的,谢谢。。有没有详细解释的链接?。:)我需要用不同的方式做这件事。。所以我需要正确的解决方案。。例如,我需要替换网格中的控件