WPF里动态切换不同的模板

今天要做一个设置的窗口,可以根据不同的设置内容使用不同的设置模版,在网上找了好久,终于决定使用放在静态资源Style中的数据触发器,简单记录一下。

首先,放了一个内容控件

 <Border BorderBrush="Silver" Name="border1">
            <ContentControl  Name="contentControl" Style="{StaticResource SettingSelectorStyle}"                              
                             />
 </Border>
接着把内容控件的Style以数据触发器的形式实现,数据触发器根据SelectedSettingIndex选择触发使用不同的数据模板

     <Style x:Key="SettingSelectorStyle" TargetType="{x:Type ContentControl}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=SelectedSettingIndex}" Value="0">
                    <Setter Property="ContentTemplate" Value="{StaticResource SamplingSettingTemplate}"/>
                </DataTrigger>
                ...
            </Style.Triggers>
        </Style>
     
再下一步就是实现各个不同的数据模板啦,举一个作为例子

        <DataTemplate x:Key="SamplingSettingTemplate">
            <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="grid1">
             ...
            </Grid>
        </DataTemplate>
这样,就可以根据DataContext中的SelectedSettingIndex属性切换不同的布局了,我在程序中使用了一个列表控件的SelectedIndex来进行切换
  <ListView  Name="lstSetting" ItemsSource="{Binding  Path=listSettingString}"
                  SelectedIndex="{Binding Path= SelectedSettingIndex, Mode=TwoWay}"
                  />

接下来又碰到了个不大不小的问题,我在资源里面绑定了不少内容,但都显示不到。用Snoop看了一下,发现数据模板的DataContext没有继承上级的DataContext,没办法,只好自己手动绑定了
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="grid1"
                     DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}}"
                  >
...
</Grid>
最后的结果就是这样的了,效果还行吧。



WPF,通过点击ListView的不同项实现动态切换窗口布局,可以通过以下步骤完成: 1. 创建一个MainWindow窗口,并在该窗口上放置一个ListView组件和一个ContentControl组件。 2. 在MainWindow的XAML代码,为ListView的ItemsSource属性绑定一个ObservableCollection对象,该对象存储着不同项的数据。 3. 在MainWindow的代码,为ListView的SelectionChanged事件注册一个事件处理程序。该事件处理程序用于控制ContentControl的内容。 4. 在SelectionChanged事件处理程序,获取ListView项的数据,并根据选项,动态切换窗口布局。 5. 可以根据需要创建多个不同布局的UserControl,并在MainWindow为每个布局创建一个实例。 6. 在SelectionChanged事件处理程序,根据选项的数据,展示对应的布局。 示例代码如下: MainWindow.xaml的ListView和ContentControl部分: ```xaml <ListView x:Name="listView" SelectionChanged="ListView_SelectionChanged"> <ListView.ItemTemplate> <DataTemplate> <!-- 设置ListView的项模板 --> </DataTemplate> </ListView.ItemTemplate> </ListView> <ContentControl x:Name="contentControl"/> ``` MainWindow.xaml.cs的事件处理程序: ```csharp private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { // 获取选项的数据 var selectedItem = listView.SelectedItem; // 根据选项的数据,动态切换窗口布局 if (selectedItem == "布局1") { contentControl.Content = new Layout1UserControl(); } else if (selectedItem == "布局2") { contentControl.Content = new Layout2UserControl(); } // 根据需要添加更多布局的切换规则 } ``` 通过以上步骤,就可以实现通过点击ListView的不同动态切换窗口布局。当用户选择不同项时,ContentControl会根据选项显示对应的布局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值