zoukankan      html  css  js  c++  java
  • WPF/Silverlight随笔 CT(二)

    我想,Silverlight只是WPF的一个子集,很多WPF的功能,在SL中并没有,比如说TemplateSelector,比如说Relative绑定。于是,我们只好采用AttachedBehavior来模拟。

    这样最好,最灵活,需要什么,就添加相应的DP,使得SL类库最小化。

    所有派生自ContentControl的类型,都使用ContentPresenter来显示它们的内容,比如说下面的CT:

            <ControlTemplate x:Key="newRadio" TargetType="{x:Type RadioButton}">
                <Border Name="border" BorderBrush="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" Padding="10" CornerRadius="100">
                    <ContentPresenter Content="{TemplateBinding ContentControl.Content}" />
                </Border>
    

    可以改写为

            <ControlTemplate x:Key="newRadio" TargetType="{x:Type RadioButton}">
                <Border Name="border" BorderBrush="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" Padding="10" CornerRadius="100">
                    <ContentPresenter />
                </Border>
    

    这时,绑定会自动发生。ContentPresenter 相当于一个占位符,把它放在那里,就代表着一个ContentControl.Content

    注:<ContentPresenter Content="{TemplateBinding ContentControl.Content}" />还可以改为<ContentPresenter Content="{TemplateBinding Content}" />

    土人才会用TextBlock,那个太慢了。

    使用CT后,就相当于把控件原先的默认模板冲掉了。这时,即使之前指定了控件的若干属性,也都会失效,因为控件的外观发生了变化。

    但是,控件上的事件不会被冲掉,仍然会被触发,因为WPF中的事件是基于RoutedEventArgs机制的。

    ControlTemplate和DataTemplate都是从FrameworkTemplate派生的。

    谁说foreach和Remove方法不能一起使用:

    for (int i = 0; i < grid.Children.Count; i++)
    {
        if (Grid.GetRow(grid.Children[i]) == 0)
        {
            grid.Children.Remove(grid.Children[i]);
            break;
        }
    }

    照着WPF=Markup+Code,写了一个Demo:WpfApplication15.zip

  • 相关阅读:
    显示AVI的第一桢
    视频采集,存成avi
    视频捕获
    如何将Wav文件做到EXE文件里
    图形整体拉出效果
    3.2 指数型生成函数
    3.1 普通型生成函数
    诡异的楼梯 HDU
    A strange lift HDU
    胜利大逃亡 HDU
  • 原文地址:https://www.cnblogs.com/Jax/p/1598597.html
Copyright © 2011-2022 走看看