wpf 修改style

最近有个奇怪的需求,希望能动态的修改DataTrigger,试了一下,没做出来,最后是通过新建了额外的一个Style解决,记录如下,希望在DataTrigger里面动态增加一个Trigger。

  <Style TargetType="{x:Type ContentControl}" x:Key="mainContentAStyle">
        <Style.Triggers x:Uid="triggerUid">
            <DataTrigger Binding="{Binding MainViewType}" Value="ControlA">
                <Setter Property="Content" >
                    <Setter.Value>
                        <Grid>
                            <my:ControlA />
                        </Grid>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>

刚开始实现思路是

private void ChangeStyle()
        {
            MainWndViewModel vm = this.DataContext as MainWndViewModel;
            if (vm != null)
            {
                Style contentStyle = mainContent.Style;
                DataTrigger newDataTrigger = new DataTrigger();
                Binding dataBinding = new Binding()
                {
                    Source = vm,
                    Path = new PropertyPath("MainViewType"),
                    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
                };
                ControlB controlB = new ControlB();
                newDataTrigger.SetValue(ContentControl.ContentProperty, controlB);
                Collection<TriggerBase> triggerCollection = new Collection<TriggerBase>();
                foreach (var item in contentStyle.Triggers)
                {
                    triggerCollection.Add(item);
                }
                triggerCollection.Add(newDataTrigger);
                //mainContent.Style.UnregisterName("triggerUid");
                //mainContent.Style.RegisterName("triggerUid", triggerCollection);
                //contentStyle.Triggers = triggerCollection;
                contentStyle.Triggers.Add(newDataTrigger);
            }
        }

发现会抛异常 “使用“TriggerCollection”之后(密封),无法对其进行修改。”

最后只好通过新建一个Style,动态切换style实现

  <Style TargetType="{x:Type ContentControl}" x:Key="mainContentBStyle">
        <Style.Triggers  >
            <DataTrigger Binding="{Binding MainViewType}" Value="ControlA">
                <Setter Property="Content" >
                    <Setter.Value>
                        <Grid>
                            <my:ControlA />
                        </Grid>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding MainViewType}" Value="ControlB">
                <Setter Property="Content" >
                    <Setter.Value>
                        <Grid>
                            <my:ControlB Focusable="False" />
                        </Grid>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>

切换

        private void btnChangeStyle_Click(object sender, RoutedEventArgs e)
        {
            MainWndViewModel vm = this.DataContext as MainWndViewModel;
            if (vm != null)
            {
                if (vm.MainViewType == MainViewType.ControlA)
                {
                    vm.MainViewType = MainViewType.ControlB;
                    mainContent.SetValue(ContentControl.StyleProperty, Application.Current.Resources["mainContentBStyle"]);
                }
                else
                {
                    vm.MainViewType = MainViewType.ControlA;
                    mainContent.SetValue(ContentControl.StyleProperty, Application.Current.Resources["mainContentAStyle"]);
                }
            }
        }
另,切换style时,ControlB仅初始化了一次。

代码

https://download.csdn.net/download/bornonew/10429724



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值